Pandas使用groupby+value_counts时如何保留所有分类避免行缺失
解决方案
方案1:显式重索引(推荐,灵活度高)
提前定义work字段的所有合法取值,在统计后通过reindex补全缺失类别,无需插入冗余的dummy行:
import pandas as pd data = [{'name':'John', 'date':20210801, 'work':False}, {'name':'John', 'date':20210802, 'work':False}, {'name':'Lucy', 'date':20210801, 'work':False}] df = pd.DataFrame(data) # 定义work字段的所有可能取值 work_all = [False, True] res = df.groupby('name')['work'].value_counts(normalize=True) \ .unstack(fill_value=0) \ # 强制补全所有work类别 .reindex(columns=work_all, fill_value=0) \ .stack() \ .reset_index(name='proportion')
输出结果:
name work proportion 0 John False 1.0 1 John True 0.0 2 Lucy False 1.0 3 Lucy True 0.0
方案2:设置分类类型(适合固定取值的字段)
如果work字段的取值固定不会变化,可以直接将其设置为pandas分类类型,后续所有分组统计操作都会自动保留全部类别:
# 将work设为分类类型,指定所有可选值 df['work'] = pd.Categorical(df['work'], categories=[False, True]) # 直接运行你原来的代码即可得到完整结构的输出 res = df.groupby('name')['work'].value_counts(normalize=True) \ .unstack(fill_value=0) \ .stack() \ .reset_index(name='proportion')
内容的提问来源于stack exchange,提问作者abisko
相关产品推荐
相关产品推荐

