用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來忽略這種錯誤:
改成html

pandas.read_csv(filePath,error_bad_lines=False)

來忽略掉其中出現錯亂(例如,因爲逗號致使多出一列)的行。url

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

print(df.columns.values)


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

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

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

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.過濾行htm

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

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

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

5.列值的集合: df['col_name'].values字符串

想實現取某一行的值並加入到一個集合中去(還有不少其餘csv也有這個列,所以沒有使用df.drop_duplicates()方法),達到去重的效果,由於對pandas不熟,沒有想到特別好的方法,最後這樣實現的:get

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

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

6.指定列的去重

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

相關文章
相關標籤/搜索