Pandas分组后如何筛选仅保留hbp=1且event=1的计数结果
解决Pandas筛选分组统计的问题
问题分析
你要的是仅统计hbp=1且event=1的记录数,不需要hbp=0的分组结果,之前的两种写法问题出在:
- 第一种
groupby加lambda的方式,会保留所有hbp的分组(包括hbp=0),所以需要额外过滤; - 第二种
query后分组的方式,默认会对所有列做计数,导致多列重复数据,应该指定统计行数或单一列。
解决方案
方案1:改进分组+过滤
先按hbp分组统计event=1的数量,再筛选出hbp=1的行:
import pandas as pd # 假设你的数据框是df result = df.groupby('hbp')['event'].apply(lambda x: (x == 1).sum()).reset_index(name='count') # 过滤掉hbp=0的行 result = result[result['hbp'] == 1]
方案2:先筛选再分组统计行数
先通过query或布尔索引筛选出符合条件的记录,再用size()统计每组行数(避免多列重复):
# 方法A:用query筛选 result = df.query('hbp == 1 and event == 1').groupby('hbp').size().reset_index(name='count') # 方法B:用布尔索引筛选(和query效果一致) filtered_df = df[(df['hbp'] == 1) & (df['event'] == 1)] result = filtered_df.groupby('hbp').size().reset_index(name='count')
方案3:直接计数(最简洁)
如果只需要hbp=1且event=1的总数量,甚至不需要分组,直接计算即可:
# 方式1:用len()统计筛选后的数据行数 count = len(df[(df['hbp'] == 1) & (df['event'] == 1)]) # 方式2:用布尔条件求和(True会被视为1,False为0) count = ((df['hbp'] == 1) & (df['event'] == 1)).sum() # 如果需要输出成DataFrame格式 result = pd.DataFrame({'hbp': [1], 'count': [count]})
示例验证
用示例数据测试:
data = { 'hbp': [1,1,1,0,0,1,0,1], 'event': [1,1,0,1,0,1,1,1] } df = pd.DataFrame(data) # 用方案2的方法A result = df.query('hbp == 1 and event == 1').groupby('hbp').size().reset_index(name='count') print(result)
输出结果:
hbp count 0 1 4
内容的提问来源于stack exchange,提问作者newdeveloper
相关产品推荐
相关产品推荐

