Pandas按id分组计算is_good为1的占比 缺失类别自动补0方法
解决方法
方法1:直接用均值计算(最简便)
因为is_good列本身就是0/1二元取值,每组的均值刚好等于取值为1的样本占比,直接分组聚合即可,天然适配全0/全1的分组场景:
import pandas as pd # 构造示例DataFrame df = pd.DataFrame({ 'id': ['a1','a1','a1','bb','bb','bb','bb','c1','c1','d2','d2'], 'is_good': [1,1,0,1,0,0,0,0,0,1,1] }) # 分组计算占比,保留两位小数 result = df.groupby('id', as_index=False)['is_good'].agg( is_good_perc = lambda x: round(x.mean(), 2) ) print(result)
输出结果:
id is_good_perc 0 a1 0.67 1 bb 0.25 2 c1 0.00 3 d2 1.00
如果需要把1.00显示为1、0.00显示为0可以自行调整数值格式。
方法2:基于value_counts补全缺失值
如果确实需要用value_counts实现,可以在分组后通过unstack把取值转成列,缺失的取值自动填充0,再提取1的占比即可:
# 分组统计占比后unstack补全缺失的0/1取值 count_norm = df.groupby('id')['is_good'].value_counts(normalize=True).unstack(fill_value=0).reset_index() # 重命名列、提取需要的字段 result = count_norm.rename(columns={1: 'is_good_perc'})[['id', 'is_good_perc']] # 保留两位小数 result['is_good_perc'] = result['is_good_perc'].round(2)
内容的提问来源于stack exchange,提问作者french_fries
相关产品推荐
相关产品推荐

