【问题标题】:pandas randomly reads one NaN?pandas 随机读取一个 NaN?
【发布时间】:2016-05-30 21:38:49
【问题描述】:

我正在使用 pandas.read_csv 读取一系列 .csv 文件。从一堆列中,我只读取了 2 个(第 2 列和第 15 列)。

   datafiles = glob.glob(mypath)
   for dfile in datafiles:
        data = pd.read_csv(dfile,header=6,usecols=['Reading','Value'])

CSV 看起来像 this,顶部有几行标题。每隔一段时间,pandas 就会将这些数字中的一个读取为 NaN。 Excel 可以毫无问题地读取这些值,并且目视检查文件我看不出是什么导致了问题。特别是在这种情况下,此文件中索引为 265 的行,数据框中索引为 263 的行,“值”列在应该为 ~27.4 时读取 NaN。

    >>>data['Value'][264]
    nan

这个问题是一致的,不会随着我阅读的文件数量而改变。在许多文件中,不存在此问题。在其余的情况下,它只会在任一列中读取一个随机数作为 NaN。我尝试使用 dtype 从自动 float64 更改为 np.float128,但这并不能解决问题。有关如何解决此问题的任何想法?

更新:grep 搜索显示换行符是 \M,只有 4 个例外——每个文件开头的行位于标题之前。进一步检查,这个特定点 [264] 在失败文件中的处理方式不同:在 5/12 文件中,这很好。在 2/12 文件中读取为 27.0,在 3/12 中读取为 nan,在 2/12 文件中读取为 2.0。其中一个文件(读取 27.0 的文件)可用于download here

【问题讨论】:

  • 文件是否可能在某些行上有不同的换行符?文件是 UTF-8-BOM 格式吗?尝试使用 notepad++ 将其切换为 UTF-8
  • 你能上传一个有问题的 CSV 文件吗?
  • @CharlieHaley 检查更新。谢谢!

标签: python python-2.7 csv pandas nan


【解决方案1】:

您的 csv 文件中似乎随机包含 null characters,它们导致了问题。要解决此问题,您需要做的是将 \0 替换为空。

以下是如何执行此操作的示例。导入是 because of 从字符串加载而不是从文件加载。

import sys
if sys.version_info[0] < 3:
    from StringIO import StringIO
else:
    from io import StringIO

datafiles = glob.glob(mypath)
for dfile in datafiles:
    st=''
    with open(dfile,'r') as f:
        for line in f:
            line = line.replace('\0','')
            st += line
    data = pd.read_csv(StringIO(st),header=6,usecols=['Reading','Value'])

如果 pandas 在将数据加载到 DataFrame 时默认具有执行此操作的功能,那就太酷了,但目前看来还没有类似的功能。

【讨论】:

  • 太棒了,非常感谢。实际上我自己只是找到了空字符,但我正在寻找一个 bash 命令行来删除它们,但这也可以!
猜你喜欢
  • 1970-01-01
  • 2019-06-17
  • 1970-01-01
  • 1970-01-01
  • 2016-11-09
  • 1970-01-01
  • 1970-01-01
  • 2017-09-16
  • 1970-01-01
相关资源
最近更新 更多