大熊猫随机读取一个NaN?

时间:2016-02-18 15:56:44

标签: python python-2.7 csv pandas nan

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

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

CSV看起来像 this,顶部有几行标题。每隔一段时间,大熊猫就会以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

1 个答案:

答案 0 :(得分: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'])

如果将数据加载到DataFrame中,pandas默认具有执行此操作的功能会很酷,但似乎现在没有这样的功能。