分组计算百分比加权平均值(样本量差异及NaN问题排查)
问卷数据加权平均计算问题解决
问题说明
现有一份多国家问卷数据集,需按问题编号、问题内容和选项分组,计算各选项的全局加权平均响应百分比。样本量存在差异:爱尔兰的样本量为150,其他国家均为200。
原始数据集
Question No Question Answers Country Response Q5 Text q5? Option 1 Ireland. 9% Q5 Text q5? Option 1 Poland 56% Q5 Text q5? Option 1 Spain 78% Q5 Text q5? Option 1 France 23% Q5 Text q5? Option 1 Chile 22% Q5 Text q5? Option 2 Ireland 19% Q5 Text q5? Option 2 Poland 44% Q5 Text q5? Option 2 Spain 65% Q5 Text q5? Option 2 France 33% Q5 Text q5? Option 2 Chile 44% Q5 Text q5? Option 3 Ireland 78% Q5 Text q5? Option 3 Poland 88% Q5 Text q5? Option 3 Spain 66% Q5 Text q5? Option 3 France 54% Q5 Text q5? Option 3 Chile 97% Q5 Text q5? Option 4 Ireland 43% Q5 Text q5? Option 4 Poland 32% Q5 Text q5? Option 4 Spain 67% Q5 Text q5? Option 4 France 23% Q5 Text q5? Option 4 Chile 21% Q6 Text q6? Option 1 Ireland 39% Q6 Text q6? Option 1 Poland 16% Q6 Text q6? Option 1 Spain 38% Q6 Text q6? Option 1 France 13% Q6 Text q6? Option 1 Chile 22% Q6 Text q6? Option 2 Ireland 38% Q6 Text q6? Option 2 Poland 82% Q6 Text q6? Option 2 Spain 64% Q6 Text q6? Option 2 France 54% Q6 Text q6? Option 2 Chile 97% Q6 Text q6? Option 3 Ireland 53% Q6 Text q6? Option 3 Poland 12% Q6 Text q6? Option 3 Spain 97% Q6 Text q6? Option 3 France 13% Q6 Text q6? Option 3 Chile 91%
用户尝试与问题
- 新增样本量列的代码:
df['Sample_Size'] = [150 if x == 'Ireland' else 200 for x in df['Country']]
- 加权平均计算公式:
(百分比1×样本量1 + 百分比2×样本量2 + ...)/ 样本量总和
- 分组计算代码(运行后结果为NaN):
Grouped = df.groupby(['Question', 'Answer'])['Response','Sample_Size'].apply(lambda x:sum(unpivot_surveys_Statista['Response']*unpivot_surveys_Statista['Sample_Size'])/sum(unpivot_surveys_Statista['Sample_Size'])).reset_index()
错误原因分析
- 变量引用错误:lambda函数中错误使用全局数据集
unpivot_surveys_Statista,而非分组后的子数据集x,分组逻辑完全失效。 - 数据类型错误:
Response列是带%的字符串格式,无法直接参与数值运算。 - 分组列不匹配:原数据中列名为
Answers而非Answer,且未包含Question No,分组维度不完整。 - 样本量判断遗漏:原始数据中爱尔兰的Country值有
Ireland.(带点),导致部分样本量赋值错误。
修正后的解决方案
步骤1:预处理Response列,转换为数值
# 去除%符号并转换为浮点数 df['Response'] = df['Response'].str.replace('%', '').astype(float)
步骤2:修正样本量列赋值
# 同时匹配带点和不带点的爱尔兰值 df['Sample_Size'] = [150 if x.strip() in ['Ireland', 'Ireland.'] else 200 for x in df['Country']]
步骤3:分组计算加权平均
# 按完整维度分组,使用子数据集x执行加权计算 grouped = df.groupby(['Question No', 'Question', 'Answers']).apply( lambda x: (x['Response'] * x['Sample_Size']).sum() / x['Sample_Size'].sum() ).reset_index(name='Weighted_Response') # 将结果转换为百分比格式(保留整数) grouped['Weighted_Response'] = grouped['Weighted_Response'].round(0).astype(str) + '%'
结果示例(Q5 Option1)
Question No Question Answers Weighted_Response Q5 Text q5? Option 1 39%
内容的提问来源于stack exchange,提问作者hyeri
相关产品推荐
相关产品推荐

