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

Python透视表如何按各分类分组计算添加响应百分比

Pandas按指定分组计算组内响应占比实现方法

问题原因

你当前代码直接对全表ID列求和,分母取的是全量样本总人数,没有按Question+Dep维度做分组聚合,因此计算出的是单组人数占全体样本的比例,不符合组内占比的计算要求。

完整实现步骤

你的原始数据是宽表结构(Q1/Q2/Q3为独立列),需要先做格式重塑,再做分组统计和占比计算,完整代码如下:

  1. 宽表转长表,拆分出独立的问题、响应值字段
import pandas as pd

# 用melt把三个问题列从宽格式转为长格式
df_long = df.melt(
    id_vars=['ID', 'Gender', 'Age', 'Dep', 'Ethnicity'],
    value_vars=['Q1', 'Q2', 'Q3'],
    var_name='Question',
    value_name='Response'
)
  1. 统计各维度组合的响应人数,补全0值记录
# 按问题、部门、响应值三个维度分组,统计每组的响应人数
df_stat = df_long.groupby(['Question', 'Dep', 'Response'], as_index=False)['ID'].count()

# 补全每个问题+部门组合下Y/N两类响应,避免某类响应人数为0时不显示
df_stat = df_stat.set_index(['Question', 'Dep', 'Response']).unstack(fill_value=0).stack().reset_index()
  1. 按分组计算组内占比
# 用transform取每个问题+部门分组的总响应人数,作为占比分母
df_stat['group_total'] = df_stat.groupby(['Question', 'Dep'])['ID'].transform('sum')
# 计算百分比,结果取整和预期输出格式对齐
df_stat['% response'] = (df_stat['ID'] / df_stat['group_total'] * 100).round(0).astype(int)
# 设置索引、删除临时列,得到最终结果
result = df_stat.drop(columns='group_total').set_index(['Question', 'Dep'])

关键逻辑说明

  • 必须先做宽表转长表,才能把Question作为独立的分组维度使用
  • 计算占比时用groupby([分组维度])[计数列].transform('sum'),会把分组求和的结果按行映射回原表,保证每一行的分母都是它所属分组的总人数,而不是全表总和
  • 补全0值记录的步骤可以保证输出结果和你预期的结构完全一致,不会漏掉人数为0的响应类别

用你提供的样例数据运行上述代码,输出的Q1、Q2部分结果和你给出的期望表结构、数值完全匹配。


内容的提问来源于stack exchange,提问作者Sandy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 14:45:28