1. 程式人生 > 程式設計 >Pandas之read_csv()讀取檔案跳過報錯行的解決

Pandas之read_csv()讀取檔案跳過報錯行的解決

讀取檔案時遇到和列數不對應的行,此時會報錯。若報錯行可以忽略,則新增以下引數:

樣式:

pandas.read_csv(***,error_bad_lines=False)

pandas.read_csv(filePath) 方法來讀取csv檔案時,可能會出現這種錯誤:

ParserError:Error tokenizing data.C error:Expected 2 fields in line 407,saw 3.

是指在csv檔案的第407行資料,期待2個欄位,但在第407行實際發現了3個欄位。

原因:header只有兩個欄位名,但資料的第407行卻出現了3個欄位(可能是該行資料包含了逗號,或者確實有三個部分),導致pandas不知道該如何處理。

解決辦法:把第407行多出的欄位刪除,或者通過在read_csv方法中設定error_bad_lines=False來忽略這種錯誤:

改為

pandas.read_csv(filePath,error_bad_lines=False)

來忽略掉其中出現錯亂(例如,由於逗號導致多出一列)的行。

KeyError錯誤:

報這種錯是由於使用了DataFrame中沒有的欄位,例如id欄位,原因可能是:

.csv檔案的header部分沒加逗號分割,此時可使用df.columns.values來檢視df到底有哪些欄位:

print(df.columns.values)

.在操作DataFrame的過程中丟掉了id欄位的header,卻沒發現該欄位已丟失。

例如:

df=df[df['id']!='null']#取得id欄位不為null的行
df=df['id']#賦值後df為Series,表示df在id列的值,而不再是一個DataFrame,於是丟掉了id的頭,此時若再使用df['id']將報錯。

取列的值,與取列的區別:

df=df['id']#取id列的值,賦值後df為Series型別,可用print(type(df))來檢視其型別
df=df[['id']]#只取df的id列作為一個新的DataFrame,賦值後df仍然是一個DataFrame
df=df[['id','age']]#取df的id和age列作為一個新的DataFrame,賦值後df仍然是一個DataFrame

過濾行

df=df[df['id']!='null']#過濾掉id欄位取值為'null'的行

注意,此處的'null'是一個字串,若df中某行id欄位的值不是字串型,或者為空,將報TypeError:invalid type comparison錯,因為只有相同型別的值才能進行比較。

解決辦法:如果不能保證id列都是string型別,則需要去掉該過濾條件。

補充知識:pandas 使用read_csv讀取檔案時產生錯誤:EOF inside string starting at line

解決方法:使用引數 quoting

df = pd.read_csv(csvfile,header = None,delimiter="\t",quoting=csv.QUOTE_NONE,encoding='utf-8')

以上這篇Pandas之read_csv()讀取檔案跳過報錯行的解決就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援我們。