如何使用Pandas按条件排除指定列并针对作答用户计算各调研问题选项的平均值
解决Pandas批量计算调研问题选项平均值(排除跳过客户)的方案
我来帮你搞定这个批量处理的需求,完全适配你有数百个调研问题的场景,不用手动一个个处理每个问题。下面是具体的实现步骤和代码:
1. 先构造原始数据(方便复现)
首先咱们先把你给出的原始DataFrame用代码构造出来:
import pandas as pd data = { 'Customer_id': ['asdsd', 'aasww', 'aaswe', 'aaswt'], 'q1_a': [0, 1, 0, 0], 'q1_b': [0, 0, 1, 1], 'q1_0': [1, 0, 0, 0], 'q2_a': [0, 0, 0, 1], 'q2_b': [0, 1, 0, 0], 'q2_c': [1, 0, 0, 0], 'q2_0': [0, 0, 1, 0] } df = pd.DataFrame(data)
2. 核心实现思路
咱们的核心需求是每个问题单独计算平均值,只统计没有跳过该问题的客户,所以步骤是:
- 自动识别所有调研问题的前缀(比如q1、q2,不管有多少个)
- 对每个问题,筛选出没有跳过的客户(对应
问题_0列值为0的行) - 计算该问题下所有选项列的平均值,最后把所有平均值整合成一行添加到原DataFrame末尾
- 同时去掉原DataFrame中的
_0列,只保留有效选项列
3. 完整代码实现
# 第一步:提取所有唯一的问题前缀(比如q1、q2) question_prefixes = list({col.split('_')[0] for col in df.columns if col != 'Customer_id'}) # 排序一下,保证顺序和原列一致(可选) question_prefixes.sort() # 第二步:初始化一个字典来存储每个选项的平均值 avg_dict = {'Customer_id': 'AVERAGE'} # 第三步:循环处理每个问题 for prefix in question_prefixes: # 获取当前问题的所有列(包括_0列) question_cols = [col for col in df.columns if col.startswith(prefix)] # 获取没有跳过该问题的客户行(_0列值为0) answered_rows = df[df[f'{prefix}_0'] == 0] # 获取当前问题的选项列(排除_0列) option_cols = [col for col in question_cols if not col.endswith('_0')] # 计算每个选项的平均值,转成百分比并保留一位小数 for col in option_cols: avg = answered_rows[col].mean() * 100 avg_dict[col] = f'{avg:.1f}%' # 第四步:处理原DataFrame,去掉所有_0列 clean_df = df.drop(columns=[col for col in df.columns if col.endswith('_0')]) # 把平均值行添加到DataFrame末尾 result_df = pd.concat([clean_df, pd.DataFrame([avg_dict])], ignore_index=True) # 查看结果 print(result_df)
4. 输出结果验证
运行上面的代码后,输出结果和你预期的完全一致:
Customer_id q1_a q1_b q2_a q2_b q2_c 0 asdsd 0 0 0 0 1 1 aasww 1 0 0 1 0 2 aaswe 0 1 0 0 0 3 aaswt 0 1 1 0 0 4 AVERAGE 33.3% 66.7% 33.3% 33.3% 33.3%
5. 批量适配说明
这个方案完全支持数百个问题的场景,只要你的列名符合问题前缀_选项和问题前缀_0的格式,代码会自动识别所有问题并批量处理,不需要修改任何逻辑,非常省心。
内容的提问来源于stack exchange,提问作者mavles
相关产品推荐
相关产品推荐

