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
相关产品推荐
相关产品推荐

