在 Python 中,如何 select 满足 NaN 数量条件的数据帧的列?

In Python, how do I select the columns of a dataframe satisfying a condition on the number of NaN?

我希望有人能帮助我。我是 Python 的新手,我有一个包含 111 列和超过 40000 行的数据框。所有列都包含 NaN 值(某些列比其他列包含更多 NaN),因此我想删除那些至少包含 80% NaN 值的列。我该怎么做?

为了解决我的问题,我尝试了下面的代码

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

函数x.isnull().sum()/len(x)是将x列中NaN的个数除以x的长度,<0.8的部分就是选择那些包含NaN少于80%的列。

问题是,当我 运行 这段代码时,我只得到列的名称和布尔值 "True" 但我想要整个列,而不仅仅是名称。我该怎么办?

你可以这样做:

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

您想实现两件事。首先,您必须找到最多包含 80% NaN 的所有列的索引。其次,您想从 DataFrame.

中丢弃它们

要获得 pandas Series 指示是否应丢弃行,您可以执行以下操作:

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)