1. 程式人生 > >用pandas處理數據遇到的坑

用pandas處理數據遇到的坑

www. null 方法 blog value invalid 查看 過濾 als

1.使用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)

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

2.KeyError錯誤:
報這種錯是由於使用了DataFrame中沒有的字段,例如id字段,原因可能是:
1.csv文件的header部分沒加逗號分割,此時可使用df.columns.values來查看df到底有哪些字段:

print(df.columns.values)


2.在操作DataFrame的過程中丟掉了id字段的header,卻沒發現該字段已丟失。
例如:

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

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

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

4.過濾行

df=df[df[id]!=null]#過濾掉id字段取值為‘null‘的行

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

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

5.列值的集合: df[‘col_name‘].values

想實現取某一行的值並加入到一個集合中去(還有很多其他csv也有這個列,因此沒有使用df.drop_duplicates()方法),達到去重的效果,因為對pandas不熟,沒有想到特別好的方法,最後這樣實現的:

id_set=set()
for id in df[id].values:
    id_set.add(id)

此法效率應該不高,若讀者有更好的方法,可留言告知,謝謝。

6.指定列的去重

可參考: https://www.cnblogs.com/everfight/p/pandas_to_list.html

用pandas處理數據遇到的坑