在 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),如果它是 NaN
和 False
(或 0)表示每个元素的有效数字。然后 .sum(axis=0)
沿列求和,给出每列中 NaN
的数量。如果该数字大于列数的 80%,则进行比较。
对于第二个任务,您可以使用它来索引您的列:
df = df[df.columns[df1]]
或按照评论中的建议做:
df.drop(df.columns[df1==False], axis=1, inplace=True)
我希望有人能帮助我。我是 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),如果它是 NaN
和 False
(或 0)表示每个元素的有效数字。然后 .sum(axis=0)
沿列求和,给出每列中 NaN
的数量。如果该数字大于列数的 80%,则进行比较。
对于第二个任务,您可以使用它来索引您的列:
df = df[df.columns[df1]]
或按照评论中的建议做:
df.drop(df.columns[df1==False], axis=1, inplace=True)