pandas 如何删除NaN最多的DataFrame行?

bmvo0sr5  于 2023-05-15  发布在  其他
关注(0)|答案(1)|浏览(140)

Pandas和本网站的其他问题/答案为我们知道要保存的非NaN数量的情况提供了解决方案。我怎样才能有效地删除最差的行,或者如果有多个行是最差的行。下面的一些示例显示了如何通过设置轴来删除列,也可以是行。但是,我们需要指定要保留多少个非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

或者将它们全部删除:

>>> df.dropna(axis=1)
   C
0  1
1  1
2  1
3  1

注意我在下面给予更多的背景。虽然一个具体的解决方案的提示是受欢迎的,我更喜欢一个关于一般情况的答案,如文章标题所述。
上下文我正在寻找一种有效的方法来删除具有最大数量NaN的行(或者如果在最大数量处存在关系,则删除行),然后类似地删除列,以便我可以重复这两个步骤,直到所有NaN被删除。目标是删除NaN,保留保持表一致的最大可能数据量,即只允许删除整个行/列。请阅读上面的通知。

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

z0qdvdin

z0qdvdin1#

您可以使用布尔索引与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))]

De Morgan's等价性:

out = df[s.ne(s.max()) | s.eq(0)]

输出:

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

另一个轴上的逻辑相同:

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

out = df.loc[:, s.ne(s.max()) | s.eq(0)]

输出:

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

相关问题