我想用多级索引清理数据框中的一些数据。
| A | B |
----------------+-----+-----+
foo 2019-01-01 | x | NaN |
2019-01-02 | x | NaN |
2019-01-03 | NaN | NaN |
................+.....+.....+
bar 2019-01-01 | NaN | x |
2019-01-02 | NaN | y |
2019-01-03 | NaN | z |
................+.....+.....+
baz 2019-01-01 | x | x |
2019-01-02 | x | x |
2019-01-03 | x | x |
我想释放由 bar 索引的完整组,因为 A 列中的所有数据都是 NaN。我想保留 foo,因为 A 列中只有部分数据是 NaN(B 列在这里并不重要,即使都是 NaN)。我想保留 baz,因为并非所有 A 列都是 NaN。 所以我的结果应该是这样的:
| A | B |
----------------+-----+-----+
foo 2019-01-01 | x | NaN |
2019-01-02 | x | NaN |
2019-01-03 | NaN | NaN |
................+.....+.....+
baz 2019-01-01 | x | x |
2019-01-02 | x | x |
2019-01-03 | x | x |
使用 pandas 和 python 执行此操作的最佳方法是什么?我想有比遍历数据更好的方法...
最佳答案
groupby.transform
, notna()
& any()
我们可以在您的第一级索引上groupby
,然后检查 A 列中的任何值是否不是NaN
。
我们使用transform
得到相同形状的 bool 数组,所以我们可以使用boolean indexing
过滤出正确的行。
m = df['A'].notna().groupby(level=0).transform('any')
df[m]
A B
idx idx2
foo 2019-01-01 x NaN
2019-01-02 x NaN
2019-01-03 NaN NaN
baz 2019-01-01 x x
2019-01-02 x x
2019-01-03 x x
m
返回什么?
m = df['A'].notna().groupby(level=0).transform('any')
print(m)
idx idx2
foo 2019-01-01 True
2019-01-02 True
2019-01-03 True
bar 2019-01-01 False
2019-01-02 False
2019-01-03 False
baz 2019-01-01 True
2019-01-02 True
2019-01-03 True
Name: A, dtype: bool
关于python - Pandas:当列中的所有数据均为 NaN 时,从多级索引中删除索引条目(及其所有行),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56869643/