熊猫:当列中的所有数据均为NaN

时间:2019-07-03 11:58:01

标签: python pandas dataframe

我想清理具有多级索引的数据框中的某些数据。

                | 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做到这一点的最佳方法是什么?我想有一种比遍历数据更好的方法...

1 个答案:

答案 0 :(得分:2)

groupby.transformnotna()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