【问题标题】:Pandas dataframe replace em-dash with nanPandas 数据框用 nan 替换 em-dash
【发布时间】:2018-11-08 12:05:48
【问题描述】:

我正在尝试使用 pd.read_excel 将大量以数字数据为主的 .xls 和 .xlsx 文件读入 python。但是,这些文件使用 em-dash 来表示缺失值。我试图让 Python 将所有这些破折号替换为 nans。我似乎无法找到让 Python 甚至识别字符的方法,更不用说替换它了。我尝试了以下不起作用

df['var'].apply(lambda x: re.sub(u'\2014','',x))

我也试过了

df['var'].astype('float')

将数据框中的所有 em-dash 转换为 nans,同时将数字数据保持为浮点数的最佳方法是什么?

【问题讨论】:

  • Google 好一点,因为我在 10 秒内找到了this
  • 复制自this post。解决方案是 df.replace()
  • 问题是我的破折号很长,而不是普通的破折号。所以正常的字符串查找/替换功能不起作用。因为 Python 不匹配 '-' 和 '-'。当我不断收到这样的错误时:UnicodeEncodeError: 'ascii' codec can't encode character u'\u2013' in position 0: ordinal not in range(128)
  • pd.read_excel 通常不使用 ascii 编解码器。你究竟是如何阅读 excel 文件的?
  • 然后以同样的方式简单地复制粘贴该符号?所以不是连字符而是您要查找的符号?

标签: python pandas utf-8


【解决方案1】:

您应该在更早的阶段发现错误。告诉pd.read_excel() 将破折号视为 NaN:

df = pd.read_excel(..., na_values=['–','—'])

【讨论】:

  • 请具体说明。它到底是怎么不起作用的?您收到错误消息了吗?
  • 代码运行没有错误,但实际上并没有将破折号转换为 nans
  • 看起来我在答案中粘贴了一个破折号而不是一个破折号。再试一次。
【解决方案2】:

不确定这些破折号到底发生了什么(当我执行 df.get_value(0,'var') 时,它显示为 u'\u2013'),但我确实找到了一个有效的解决方案,它转换了破折号到 nans 并将数字数据保留为数字。

import unicodedata

df['var']=df['var'].map(unicode)
df['var']=df['var'].apply(lambda x: unicodedata.normalize('NFKD', x).encode('ascii','ignore'))
df['var']=pd.to_numeric(df['var'])

【讨论】:

    【解决方案3】:

    df.replace({'-': None}) 是您正在寻找的。在另一篇关于堆栈溢出的帖子中找到。

    【讨论】:

      【解决方案4】:

      我认为最直接的方法是使用pd.to_numericerrors='coerce' 参数:

      df['var'] = pd.to_numeric(df['var'], errors='coerce')
      

      来自docs

      如果'coerce',则无效解析将被设置为NaN

      【讨论】:

        猜你喜欢
        • 2016-10-16
        • 2022-10-05
        • 2021-11-24
        • 2017-12-03
        • 2021-11-20
        • 1970-01-01
        • 1970-01-01
        • 2012-10-29
        相关资源
        最近更新 更多