2016-08-23 73 views
0

我希望有人能幫助我。我是Python的新手,我有一個有111列和40 000多行的數據框。所有列都包含NaN值(某些列包含比其他列更多的NaN),所以我想刪除那些至少有80%NaN值的列。我怎樣才能做到這一點?在Python中,如何選擇滿足NaN數量條件的數據框的列?

爲了解決我的問題,我嘗試以下代碼

df1=df.apply(lambda x : x.isnull().sum()/len(x) < 0.8, axis=0) 

功能x.isnull().sum()/len(x)是由x的長度來劃分在列X的NaN的數目,和所述部分< 0.8是選擇那些含有少於80%NaN的柱子。

問題是,當我運行此代碼時,我只將列名與布爾值「True」一起獲取,但我想要整列,而不僅僅是名稱。我該怎麼辦?

+0

當你有列的名稱你想放棄,你可以在你的原始數據框上使用pandas drop功能:http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.drop.html你需要指定axis = 1 drop columns – Quickbeam2k1

+0

你的意思是類似於df = df.drop(df1,axis = 1)?仍然不起作用,我的數據框保持不變。 – user322778

+0

不,我的意思是像df.drop(cols,axis = 1,inplace = True)。由於inplace,cols沒有分配列名。 – Quickbeam2k1

回答

2

你可以這樣做:

filt = df.isnull().sum()/len(df) < 0.8 
df1 = df.loc[:, filt] 
+1

哦,你打賭我......我會留下我的答案,因爲它有更多的解釋。 – jotasi

+1

不錯!謝謝!這工作只是完美:) – user322778

2

你想達到兩個目的。首先,您必須找到所有包含至多80%的列的索引。其次,你想從你的DataFrame中丟棄它們。

要獲得pandasSeries指示是否行應做丟棄,你可以這樣做:

df1 = df.isnull().sum(axis=0) < 0.8*df.shape[1] 

(順便說一句,你有你的問題一個錯字你應該放下==True,因爲它總是測試。是否0.5==True

這將給True所有列索引保持,爲.isnull()True(或1),如果它是有效數字NaNFalse(或0)每個元素。然後沿着欄中的.sum(axis=0)總和給出每列中NaN的數量。然後進行比較,如果該數字大於列數的80%。

對於第二個任務,你可以通過使用該索引你的列:

df = df[df.columns[df1]] 

或做在評論中建議:

df.drop(df.columns[df1==False], axis=1, inplace=True) 
+0

感謝您的回答,我選擇了另一個,因爲它很短,工作完美。我想要upvote你的答案,但我不能:(但是,謝謝你的寫作! – user322778

+0

@ user322778沒問題,它或多或少與接受的答案一樣,我剛剛看完之前就完成了其他人回答,並且只是將它留在這裏,因爲它有一些額外的解釋。 – jotasi

相關問題