用pandas處理數據遇到的坑
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處理數據遇到的坑