pandas按两列分组后如何计算组层级的百分比占比
实现方法
你已经写出了分组计数的代码,后续只需要按region维度对计数做组内归一化,就能得到需要的占比,两种实现方式如下:
基于现有计数逻辑改造
在你原有代码的基础上,对多级索引的计数结果按region层级分组,用组内各gender的计数除以组内总计数即可:
# 原有计数逻辑 count_res = df.groupby(['region', 'gender']).size().rename("count") # 计算占比 share_res = count_res.groupby(level=0) .apply(lambda group: group / group.sum()) .rename("share") .reset_index() # 保留两位小数匹配示例输出 .assign(share=lambda df: df.share.round(2))
输出结果:
region gender share 0 A F 0.50 1 A M 0.50 2 B F 0.67 3 B M 0.33
如果不需要四舍五入,要严格得到你示例里的0.33、0.66,把round逻辑换成两位截断即可:.assign(share=lambda df: df.share.apply(lambda x: int(x*100)/100))
一步到位的简洁写法
用pandas的value_counts自带的归一化参数,不需要手动写除法逻辑,直接输出占比结果:
share_res = df.groupby('region')['gender'] .value_counts(normalize=True) .rename("share") .reset_index() .assign(share=lambda df: df.share.round(2))
参数说明:normalize=True会自动将计数转换为对应维度的占比,由于是在groupby('region')之后调用,占比的计算基准是每个region分组内的总样本量,完全匹配需求。
内容的提问来源于stack exchange,提问作者Carbo
相关产品推荐
相关产品推荐

