首页 > 解决方案 > 使用 groupby 过滤掉特定列的所有 NaN 行

问题描述

id当列中的所有值a都是 NaN时,我试图在 groupby 时过滤掉行。因此,在所有id情况下,如果日期中的所有观察结果都是 NaN,我想过滤掉该行。例如我想过滤掉id= 2

df

            date  id   a    b    c   d
    0   1/1/2000   1  10   20  10.0  11
    1   1/1/2000   2  NaN  21   1.0  11
    2   1/1/2000   3  15   20  14.0  11
    3   1/1/2000   4  NaN  24  13.0  11
    4   1/2/2000   1  10   25  10.0  11
    5   1/2/2000   2  NaN  20  13.0  15
    6   1/2/2000   3  10   26  22.0  11
    7   1/2/2000   4  10   20  16.0  13
    8   1/3/2000   1  10   20  10.0  11
    9   1/3/2000   2  NaN  20  13.0  11
    10  1/3/2000   3  10   20  18.0  11
    11  1/3/2000   4  10   20  10.0  11

所需的数据框

        date  id   a    b    c   d
0   1/1/2000   1  10   20  10.0  11
1   1/1/2000   3  15   20  14.0  11
2   1/1/2000   4  NaN  24  13.0  11
3   1/2/2000   1  10   25  10.0  11
4   1/2/2000   3  10   26  22.0  11
5   1/2/2000   4  10   20  16.0  13
6   1/3/2000   1  10   20  10.0  11
7   1/3/2000   3  10   20  18.0  11
8   1/3/2000   4  10   20  10.0  11

标签: pythonpandas

解决方案


测试非缺失值Series.notna,然后通过 获取至少一个匹配的所有组,GroupBy.any用于GroupBy.transform返回Series与原始大小相同的返回,因此可以过滤boolean indexing

df = df[df['a'].notna().groupby(df['id']).transform('any')]
print (df)
        date  id     a   b     c   d
0   1/1/2000   1  10.0  20  10.0  11
2   1/1/2000   3  15.0  20  14.0  11
3   1/1/2000   4   NaN  24  13.0  11
4   1/2/2000   1  10.0  25  10.0  11
6   1/2/2000   3  10.0  26  22.0  11
7   1/2/2000   4  10.0  20  16.0  13
8   1/3/2000   1  10.0  20  10.0  11
10  1/3/2000   3  10.0  20  18.0  11
11  1/3/2000   4  10.0  20  10.0  11

或者使用DataFrame.locfor 过滤器也没有id丢失a,然后过滤原始列:Series.isinboolean indexing

df = df[df['id'].isin(df.loc[df['a'].notna(), 'id'])]
print (df)
        date  id     a   b     c   d
0   1/1/2000   1  10.0  20  10.0  11
2   1/1/2000   3  15.0  20  14.0  11
3   1/1/2000   4   NaN  24  13.0  11
4   1/2/2000   1  10.0  25  10.0  11
6   1/2/2000   3  10.0  26  22.0  11
7   1/2/2000   4  10.0  20  16.0  13
8   1/3/2000   1  10.0  20  10.0  11
10  1/3/2000   3  10.0  20  18.0  11
11  1/3/2000   4  10.0  20  10.0  11

推荐阅读