python - 使用 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
解决方案
测试非缺失值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.loc
for 过滤器也没有id
丢失a
,然后过滤原始列:Series.isin
boolean 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
推荐阅读
- flutter - 在 null 上调用了方法“XXX”
- node.js - 使用命令行工具删除一个特定的空 git commit
- python - 在 JSON 嵌套对象中搜索组合
- javascript - 多个按钮保持专注的 HTML
- cloudflare - Cloudflare 不尊重我的原始缓存控制标头
- python - 使用 pip-review 更新包不起作用
- javascript - 有没有办法做一个懒惰的向后看?
- javascript - 根据 jQuery 多选 select2 中的选定值更新下拉选项
- java - 在java中使用Arrays.sort对二维数组进行排序
- indexing - Janusgraph 未在生产中使用索引