大熊猫误读了文件中的行

时间:2018-06-10 02:15:47

标签: python-3.x pandas

我正在尝试使用python 3.6阅读以下带有pandas的文件:

$ cat tmp2.txt
somename     nan                                0       0     1     0     0       1       11    0.909091  0       0     1     0     0     7     1     1     0     0     0       0     2       
somename     nan                                0       0     1     0     0       1       36    0.972222  0       0     7     0     5     22    0     6     1     0     0       0     2       
somename UgzVrvH-ahjgfT9-NfN4AaABAg.8e3_FgQnopN8e4FLHwai7v0       0     1     0     0             0       25    0.920000  0       0     0     0     2     22    0     1     0     0     0       0           0   
somename     UgxyXxibolL_qOhMsyZ4AaABAg.8eApKy29u5J8eAxINbTH2m0       0     1     0     0       0       13    1.000000  0       0     0     0     1     10    0     2     0     0     0       0     0       
somename     nan                                0       0     0     0     0       2       56    0.839286  0       0     0     0     11    14    5     7     3     0     3       1     10

当我尝试用熊猫阅读时:

>>> import pandas as pd
>>> df  = pd.read_csv(header=None, filepath_or_buffer="tmp2.txt", delim_whitespace=True, index_col=0)
>>> df.values[2,:]
array(['UgzVrvH-ahjgfT9-NfN4AaABAg.8e3_FgQnopN8e4FLHwai7v0', 0, 1, 0, 0,
       0, 25, 0.92, 0.0, 0, 0, 0, 2, 22, 0, 1, 0, 0, 0, 0, 0, nan],
      dtype=object)
>>> df.values[3,:]
array(['UgxyXxibolL_qOhMsyZ4AaABAg.8eApKy29u5J8eAxINbTH2m0', 0, 1, 0, 0,
       0, 13, 1.0, 0.0, 0, 0, 0, 1, 10, 0, 2, 0, 0, 0, 0, 0, nan],
      dtype=object)
>>> df.values[4,:]
array([nan, 0, 0, 0, 0, 0, 2, 56.0, 0.8392860000000001, 0, 0, 0, 0, 11,
       14, 5, 7, 3, 0, 3, 1, 10.0], dtype=object)

从我打印df.values[2,:]df.values[3,:]时可以看出,我最后得到了一个无关的nan。看起来这可能是每行最多字符数的问题,但pandas.read_csv的手册页中没有提到任何内容。

问题:导致此问题的原因是什么?如何让pandas.read_csv正确读取此文件?

1 个答案:

答案 0 :(得分:0)

与此类似:python pandas - trailing delimiter confuses read_csv

您的输入数据在部分或全部行上都有尾随分隔符。两个简单的修复方法是在usecols中设置read_csv(),或者在阅读后执行以下操作:

if df[df.columns[-1]].isnull().all():
    df.drop(df.columns[-1], axis=1, inplace=True)