2016-11-30 94 views
0

我的文件是这样的
大熊猫可变列失败

4 7 a a 
    s g 6 8 0 d 
    g 6 2 1 f 7 9 
    f g 3 
    1 2 4 6 8 9 0 

我用熊猫将其保存在大熊猫对象的形式。但我收到以下错误
pandas.parser.CParserError: Error tokenizing data. C error: Expected 6 fields in line 3, saw 8

我使用的代码是
file = pd.read_csv("a.txt",dtype = None,delimiter = " ")

任何人都可以提出一个想法,包括文件本身?

+0

你知道吗,有多少列?或者那也不确定?像这里一样,如果7是最大列数,那么方法就是这样。 – Zero

+0

我也不确定列的数量 –

回答

1

这是一种方法。

In [50]: !type temp.csv 
4,7,a,a 
s,g,6,8,0,d 
g,6,2,1,f,7,9 
f,g,3 
1,2,4,6,8,9,0 

阅读csv列表的列表,然后转换为DataFrame。

In [51]: pd.DataFrame([line.strip().split(',') for line in open('temp.csv', 'r')]) 
Out[51]: 
    0 1 2  3  4  5  6 
0 4 7 a  a None None None 
1 s g 6  8  0  d None 
2 g 6 2  1  f  7  9 
3 f g 3 None None None None 
4 1 2 4  6  8  9  0 
+0

谢谢,这是我一直在寻找 –

0

使用熊猫这会引发错误,因为函数期望有一定数量的列,在这种情况下是6,但是当它到达第三行时,它会遇到8.一种处理方法是不读取与数据框的第一行相比具有更多列的行。这可以使用error_bad_lines参数完成。这就是文档说约error_bad_lines

error_bad_lines:布尔,默认真行有太多的领域 (例如用逗号过多一个CSV线)默认情况下将导致 异常升高,且无DataFrame将被返回。如果为False,则返回 ,然后这些“坏线”将从返回的 的DataFrame中删除。 (仅使用C解析器有效)

所以,你可以这样做:

>>> file = pd.read_csv("a.txt",dtype = None,delimiter = " ",error_bad_lines=False) 
Skipping line 3: expected 6 fields, saw 8 
Skipping line 5: expected 6 fields, saw 7 

>>> file 
    4 7 a a.1 
s g 6 8.0 0.0 d 
f g 3 NaN NaN NaN 

或者你可以使用skiprows参数跳过,你想行,这是什么文档不得不说skiprows

skiprows:列表状或整数,默认无线编号,以在文件的开始跳过 (0索引)或数字线跳过(INT)的

+0

我应该补充一点,如果您将逗号作为分隔符添加到文件中,您可以将额外逗号添加到数据较少的行,并且它可以正常工作。 –

+0

我不希望这些行被省略 –