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

Python中如何循环遍历透视表所有问题列实现问卷数据批量统计

问卷数据透视自动识别问题列方案

你不需要手动枚举所有问题列名,也不用写复杂循环,通过排除固定非问题字段的方式就能自动提取所有问题列,适配任意数量的问卷题目。

实现代码

# 1. 定义所有非问题类的固定字段,后续新增非问题字段直接追加到这个列表即可
fixed_cols = ['ID', 'Gender', 'Dep', 'Age', 'Ethnicity']
# 2. 自动提取所有问题列:所有不在固定字段列表里的列都判定为问题列
question_cols = [col for col in df.columns if col not in fixed_cols]

# 3. 执行透视逻辑,和你原有逻辑兼容,同时补充你需要的计数字段、百分比字段
df2 = df[fixed_cols + question_cols].melt(
    id_vars=['ID','Gender', 'Dep'],
    var_name='Question',
    value_name='Response'
).pivot_table(
    index=['Question', 'Dep', 'Response'],
    columns='Gender',
    values='ID',
    aggfunc='count',
    fill_value=0
).rename(columns={'M': '#M', 'F': '#F'})

# 计算分性别人数占比
df2['%M'] = (df2['#M'] / df2.groupby(level=['Question', 'Dep'])['#M'].transform('sum') * 100).fillna(0).astype(int)
df2['%F'] = (df2['#F'] / df2.groupby(level=['Question', 'Dep'])['#F'].transform('sum') * 100).fillna(0).astype(int)

# 调整列顺序和目标输出结构对齐
df2 = df2[['#M', '#F', '%M', '%F']]

可选优化

如果你的问题列有统一命名规则(比如全部以Q开头),可以把问题列提取逻辑替换成更精准的规则,避免把其他非目标列算进去:

# 仅筛选以Q开头的列作为问题列
question_cols = [col for col in df.columns if col.startswith('Q')]

代码里用pivot_table自带的fill_value=0参数替代后续单独调用fillna(0),运行效率更高。最终输出的表格结构和你给出的样例完全一致,新增任意数量的问题列都不需要修改代码。

内容的提问来源于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 11:27:22