熊猫:如何解决“错误标记数据”?

the*_*ozh 5 python csv pandas

关于SO的这个话题已经问很多问题。(以及许多其他)。到目前为止,在众多答案中,没有一个对我有真正的帮助。如果我错过 有用的,请告诉我。

我只是想将带有熊猫的CSV文件读入数据框。听起来很简单。

我的档案 Test.csv

1,2,3,4,5
1,2,3,4,5,6
,,3,4,5
1,2,3,4,5,6,7
,2,,4
Run Code Online (Sandbox Code Playgroud)

我的代码:

import pandas as pd
df = pd.read_csv('Test.csv',header=None)
Run Code Online (Sandbox Code Playgroud)

我的错误:

pandas.errors.ParserError: Error tokenizing data. C error: Expected 5 fields in line 2, saw 6
Run Code Online (Sandbox Code Playgroud)

我对这个问题的猜测是,Pandas查找第一行,并期望接下来的行中具有相同数量的令牌。如果不是这种情况,它将以错误停止。

在众多答案中,使用选项的建议例如: error_bad_lines=Falseheader=Noneskiprows=3更多无用的建议。

但是,我不想忽略任何行或跳过。而且我不预先知道数据文件有多少列和行。

因此,基本上可以归结为如何找到数据文件中的最大列数。这是要走的路吗?我希望有一种简单的方法可以简单地读取第一行中没有最大列号的CSV文件。谢谢您的提示。我在Win7上使用Python 3.6.3,Pandas 0.24.1。

the*_*ozh 5

感谢@ALollz提供的“非常新鲜”链接(幸运的巧合),感谢@Rich Andrews指出我的示例实际上不是“严格正确”的CSV数据。

因此,暂时适用于我的方式是通过@ALollz的紧凑型解决方案(/sf/answers/3859082251/)改编的

### reading an "incorrect" CSV to dataframe having a variable number of columns/tokens 
import pandas as pd

df = pd.read_csv('Test.csv', header=None, sep='\n')
df = df[0].str.split(',', expand=True)
# ... do some modifications with df
### end of code
Run Code Online (Sandbox Code Playgroud)

df''在开头和中间包含缺少条目的空字符串,在结尾处包含空字符串None

   0  1  2  3     4     5     6
0  1  2  3  4     5  None  None
1  1  2  3  4     5     6  None
2        3  4     5  None  None
3  1  2  3  4     5     6     7
4     2     4  None  None  None
Run Code Online (Sandbox Code Playgroud)

如果您通过以下方式再次将其写入文件:

df.to_csv("Test.tab",sep="\t",header=False,index=False)

1   2   3   4   5       
1   2   3   4   5   6   
        3   4   5       
1   2   3   4   5   6   7
    2       4           
Run Code Online (Sandbox Code Playgroud)

None将被转换为空字符串'',一切都很好。

下一个级别是考虑包含引号的数据字符串,其中包含分隔符,但这是另一个主题。

1,2,3,4,5
,,3,"Hello, World!",5,6
1,2,3,4,5,6,7
Run Code Online (Sandbox Code Playgroud)