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
您可以使用带有 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)
| 归档时间: |
|
| 查看次数: |
46 次 |
| 最近记录: |