如何使用Python计算分类列的分组(组内)占比
Python分类列组内占比计算方案
需求背景
需统计各研究地点的性别分类占比,提问者已给出一种可行的单行实现方案,以下为具体实现及替代方案参考。
示例DataFrame构造
import pandas as pd # 构造测试数据 df = pd.DataFrame({"location": {0: "site 1", 1: "site 1", 2: "site 2", 3: "site 2", 4: "site 1"}, "gender": {0: "male", 1: "female", 2: "male", 3: "female", 4: "female"}}) print(df)
原实现方案
实现逻辑
- 调用groupby按location字段分组
- 使用value_counts加normalize参数统计组内频次占比
- 使用unstack将层级结果展开为二维表
- 乘以100转换为百分比格式后保留2位小数
对应代码
round(df.groupby(['location'])['gender'].value_counts(normalize = True).unstack()*100, 2)
替代实现方案
方案1:使用crosstab实现(最简洁)
crosstab原生支持按行/列归一化,代码可读性更高:
pd.crosstab(index=df['location'], columns=df['gender'], normalize='index').round(2)*100
方案2:使用pivot_table实现
适合需要同步聚合其他指标的复杂场景:
df.pivot_table( index='location', columns='gender', aggfunc='size', fill_value=0 ).apply(lambda x: x/x.sum(), axis=1).round(2)*100
方案3:分步计算实现
逻辑拆分清晰,便于调试中间结果:
# 第一步:统计各地点各性别的样本数 group_count = df.groupby(['location', 'gender']).size().unstack(fill_value=0) # 第二步:按行计算各组占比 gender_rate = group_count.div(group_count.sum(axis=1), axis=0).round(2)*100
内容的提问来源于stack exchange,提问作者Rahul Raoniar
相关产品推荐
相关产品推荐

