我想清理具有多级索引的数据框中的某些数据。
| 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做到这一点的最佳方法是什么?我想有一种比遍历数据更好的方法...
答案 0 :(得分:2)
groupby.transform
,notna()
和any()
我们可以在您的一级索引上groupby
,然后检查A列中的值是否不是NaN
。
我们使用transform
返回相同形状的布尔数组,因此我们可以使用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