如何不存储为中间变量直接过滤pandas groupby聚合输出结果
可行的链式调用实现方案
你之前的代码报错是因为两个语法问题:
- 中括号里写
'Y'.isna()是对字符串'Y'本身判断空值,不是引用Y列 - query语句里给
Y加了单引号,会被识别为字符串而非列名
方法1:用loc+匿名函数过滤(推荐,性能更好)
直接在loc中传入匿名函数引用中间聚合结果,无需额外定义变量存储:
# 结果索引为符合条件的col1值,列N为对应N的计数 data.groupby('col1')['col2'].value_counts().unstack(level=1).loc[lambda df: df['Y'].isna(), ['N']] # 如果需要把col1转为普通列,加reset_index即可 data.groupby('col1')['col2'].value_counts().unstack(level=1).loc[lambda df: df['Y'].isna(), ['N']].reset_index()
方法2:修正query语法实现过滤
去掉query语句中Y的引号即可生效:
data.groupby('col1')['col2'].value_counts().unstack(level=1).query("Y.isna()")[['N']].reset_index()
更轻量化的替代写法(无需unstack)
也可以直接在分组阶段判断该ID所有记录是否全为N,再统计计数:
data.groupby('col1').filter(lambda g: (g['col2'] == 'N').all()).groupby('col1').size().reset_index(name='N')
内容的提问来源于stack exchange,提问作者Veki
相关产品推荐
相关产品推荐

