如何删除 NaN 数量最多的 DataFrame 行?

oly*_*lyk 1 python nan missing-data dataframe pandas

当我们知道要保留的非 NaN 数量时,本网站中的 Pandas 和其他问题/答案为这种情况提供了解决方案。如何有效地仅删除最差的行,或者如果有多个行是最差的行。下面的一些示例展示了如何通过设置轴来删除列,也可以删除行。然而,我们需要指定要保留多少个非 NaN。

>>> import numpy as np
>>> df = pd.DataFrame([[1,np.nan,1,np.nan], [1,1,1,1], [1,np.nan,1,1], [np.nan,1,1,1]], columns=list('ABCD'))
     A    B  C    D
0  1.0  NaN  1  NaN
1  1.0  1.0  1  1.0
2  1.0  NaN  1  1.0
3  NaN  1.0  1  1.0

>>> df.dropna(thresh=3, axis=1)
     A  C    D
0  1.0  1  NaN
1  1.0  1  1.0
2  1.0  1  1.0
3  NaN  1  1.0
Run Code Online (Sandbox Code Playgroud)

或者完全删除它们:

>>> df.dropna(axis=1)
   C
0  1
1  1
2  1
3  1
Run Code Online (Sandbox Code Playgroud)

请注意, 我在下面提供了更多背景信息。虽然欢迎提供具体解决方案的提示,但我更喜欢帖子标题中所述的有关一般情况的答案。

上下文 我正在寻找一种有效的方法来删除 NaN 数量最多的行(或者如果最大数量有联系则删除行),然后类似地删除列,以便我可以重复这两个步骤直到所有 NaN 都被删除。目标是删除 NaN,保留最大可能的数据量,保持表一致,即只允许删除整个行/列。请阅读上面的通知。

上面的例子摘自这个答案: https ://stackoverflow.com/a/68306367/9681577

moz*_*way 5

您可以使用带有 NaN 计数的布尔索引:

# count the number of NaNs per row
s = df.isna().sum(axis=1)

# drop rows which have the max number, if > 0
out = df[~(s.eq(s.max()) & s.gt(0))]
Run Code Online (Sandbox Code Playgroud)

德摩根等价:

out = df[s.ne(s.max()) | s.eq(0)]
Run Code Online (Sandbox Code Playgroud)

输出:

     A    B  C    D
1  1.0  1.0  1  1.0
2  1.0  NaN  1  1.0
3  NaN  1.0  1  1.0
Run Code Online (Sandbox Code Playgroud)

列

另一个轴上的逻辑相同:

s = df.isna().sum(axis=0)

out = df.loc[:, s.ne(s.max()) | s.eq(0)]
Run Code Online (Sandbox Code Playgroud)

输出:

     A  C    D
0  1.0  1  NaN
1  1.0  1  1.0
2  1.0  1  1.0
3  NaN  1  1.0
Run Code Online (Sandbox Code Playgroud)