2014-06-12 27 views
1

代碼示例:保存線由pd.read_csv跳過到一個單獨的數據幀

data = 'a,b,c\n1,2,3\n4,5,6,7\n8,9,10' 
pd.read_csv(StringIO(data), error_bad_lines=False) 

Skipping line 3: expected 3 fields, saw 4 

我想這裏是讓跳過線,並將其保存在其他地方像另一個數據幀或陣列。

我實際處理的每個文件的長度約爲8K行,4至12列,跳過的行有一些我不想丟失的信息。

我試圖用

try: 
    pd.read_csv(StringIO(data), error_bad_lines=False) 
except(pd.parser.CParserError) 

如何抓住 「壞線」?

文件之一:http://www.pjm.com/pub/account/loadhryr/1998.txt

回答

1

不知道官方(TM)的方法是什麼,但我經常通過names,然後做我的後處理。例如:

>>> pd.read_csv(StringIO(data), names=["a", "b", "c", "other stuff"], skiprows=1) 
    a b c other stuff 
0 1 2 3   NaN 
1 4 5 6   7 
2 8 9 10   NaN 

後,您可以使用布爾過濾像df[df['other stuff'].notnull()]選擇具有額外數​​據的人。

>>> pd.read_csv(StringIO(data), names=range(10), header=None) 
    0 1 2 3 4 5 6 7 8 9 
0 a b c NaN NaN NaN NaN NaN NaN NaN 
1 1 2 3 NaN NaN NaN NaN NaN NaN NaN 
2 4 5 6 7 NaN NaN NaN NaN NaN NaN 
3 8 9 10 NaN NaN NaN NaN NaN NaN NaN 

我甚至做過的事情在過去上手,但你必須確保你轉換dtypes適當地在年底,所以你不必慢perfoming對象,當你可以漂浮。我通常只使用它作爲中間步驟,然後立即寫出一個格式更好的csv,所以它並不重要。

(我想,你不關心性能「無損」數據讀取方法,你只關心怎樣在所有的數據,但就我所知,有一個已經存在。)

+0

謝謝你非常感謝你的幫助! 「名稱」方法適用於具有相同格式的文件,而原始數據文件的格式發生變化(列數增加,因此Bad行數),我必須手動調整要讀取的所有名稱的長度數據。我想知道是否有一種方法可以自動調整名稱參數,或者我只是設置了一個足夠大的範圍,如100。 再次,非常感謝您的幫助! – user3735277