Pandas。当某一列的所有数据为NaN时,从多级索引中删除索引条目(以及它的所有行)。[英] Pandas: Remove index entry (and all it's rows) from multilevel index when all data in a column is NaN

本文是小编为大家收集整理的关于Pandas。当某一列的所有数据为NaN时,从多级索引中删除索引条目(以及它的所有行)。的处理方法,想解了Pandas。当某一列的所有数据为NaN时,从多级索引中删除索引条目(以及它的所有行)。的问题怎么解决?Pandas。当某一列的所有数据为NaN时,从多级索引中删除索引条目(以及它的所有行)。问题的解决办法?那么可以参考本文帮助大家快速定位并解决问题。

问题描述

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

                | 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 is 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做到这一点是什么?我想有一种比循环浏览数据更好的方法...

推荐答案

notna() notna() notna() & any() any() /H3>

我们可以在您的第一级索引上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

本文地址:https://www.itbaoku.cn/post/1728075.html