2016-11-30 93 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

我不希望這些行被省略 –