过滤掉超过一定数量的 NaN 的行
Posted
技术标签:
【中文标题】过滤掉超过一定数量的 NaN 的行【英文标题】:Filter out rows with more than certain number of NaN 【发布时间】:2014-06-05 21:16:02 【问题描述】:在 Pandas 数据框中,我想过滤掉所有超过 2 个NaN
s 的行。
基本上,我有 4 列,我想只保留至少 2 列具有有限值的那些行。
有人可以建议如何实现这一目标吗?
【问题讨论】:
【参考方案1】:我有一个稍微不同的问题,即过滤掉具有超过一定数量 NaN 的 列:
import pandas as pd
import numpy as np
df = pd.DataFrame('a':[1,2,np.nan,4,5], 'b':[np.nan,2,np.nan,4,5], 'c':[1,2,np.nan,np.nan,np.nan], 'd':[1,2,3,np.nan,5])
df
a b c d
0 1.0 NaN 1.0 1.0
1 2.0 2.0 2.0 2.0
2 NaN NaN NaN 3.0
3 4.0 4.0 NaN NaN
4 5.0 5.0 NaN 5.0
假设您要过滤掉具有 3 个或更多 Nan 的列:
num_rows = df.shape[0]
drop_cols_with_this_amount_of_nans_or_more = 3
keep_cols_with_at_least_this_number_of_non_nans = num_rows - drop_cols_with_this_amount_of_nans_or_more + 1
df.dropna(axis=1,thresh=keep_cols_with_at_least_this_number_of_non_nans)
输出:(列 c 已按预期删除):
a b d
0 1.0 NaN 1.0
1 2.0 2.0 2.0
2 NaN NaN 3.0
3 4.0 4.0 NaN
4 5.0 5.0 5.0
【讨论】:
【参考方案2】:您在这里提出了 2 个略有不同的问题。在一般的情况下,他们有不同的答案。
我只想保留至少有 2 列的行 有限值。
df = df.dropna(thresh=2)
这保留行具有 2 个或更多非空值。
我想过滤掉所有超过 2 个
NaNs
的行
df = df.dropna(thresh=df.shape[1]-2)
这过滤掉具有 2 个或更多 null 值的行。
在您的 4 列示例数据框中,这些操作是等效的,因为 df.shape[1] - 2 == 2
。但是,您会注意到与不完全包含 4 列的数据帧存在差异。
注意dropna
也有一个subset
参数,如果您希望在应用阈值时仅包含指定的列。例如:
df = df.dropna(subset=['col1', 'col2', 'col3'], thresh=2)
【讨论】:
【参考方案3】:以下应该可以工作
df.dropna(thresh=2)
见online docs
我们在这里所做的是删除任何 NaN
行,其中连续有 2 个或多个非 NaN
值。
例子:
In [25]:
import pandas as pd
df = pd.DataFrame('a':[1,2,NaN,4,5], 'b':[NaN,2,NaN,4,5], 'c':[1,2,NaN,NaN,NaN], 'd':[1,2,3,NaN,5])
df
Out[25]:
a b c d
0 1 NaN 1 1
1 2 2 2 2
2 NaN NaN NaN 3
3 4 4 NaN NaN
4 5 5 NaN 5
[5 rows x 4 columns]
In [26]:
df.dropna(thresh=2)
Out[26]:
a b c d
0 1 NaN 1 1
1 2 2 2 2
3 4 4 NaN NaN
4 5 5 NaN 5
[4 rows x 4 columns]
编辑
对于上面的示例,它可以工作,但您应该注意,您必须知道列数并适当地设置 thresh
值,我最初以为它是指 NaN
值的数量,但它实际上意味着非 NaN
值。
【讨论】:
如果我想创建一个包含 2 个或更多空值的行的数据框,而不是删除它们。我该怎么做? 使用:df = df[df.isnull().sum(axis=1) >= 2]以上是关于过滤掉超过一定数量的 NaN 的行的主要内容,如果未能解决你的问题,请参考以下文章
为啥 TDengine 数据库在相同的过滤条件下不能返回相同数量的行?