2016-08-23 32 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

相关问题