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

分组计算百分比加权平均值(样本量差异及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%

用户尝试与问题

  1. 新增样本量列的代码:
df['Sample_Size'] = [150 if x == 'Ireland' else 200 for x in df['Country']]
  1. 加权平均计算公式:

(百分比1×样本量1 + 百分比2×样本量2 + ...)/ 样本量总和

  1. 分组计算代码(运行后结果为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()

错误原因分析

  1. 变量引用错误:lambda函数中错误使用全局数据集unpivot_surveys_Statista,而非分组后的子数据集x,分组逻辑完全失效。
  2. 数据类型错误:Response列是带%的字符串格式,无法直接参与数值运算。
  3. 分组列不匹配:原数据中列名为Answers而非Answer,且未包含Question No,分组维度不完整。
  4. 样本量判断遗漏:原始数据中爱尔兰的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 05:36:17