You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 20:09:02