如何在R中计算列表内各DataFrame指定列的加权平均值?
DataFrame列表的加权平均实现方案
核心思路
针对目标列(Age、salary),分别计算所有DataFrame对应列的加权求和,再除以权重总和得到最终加权平均值,最后整理成新的DataFrame。
代码实现
首先导入依赖库:
import pandas as pd import numpy as np
步骤1:准备数据(替换为你的真实数据即可)
# 构造100行的DataFrame示例列表 df_list = [ pd.DataFrame({ 'Gender': ['M', 'F']*50, 'Age': np.random.randint(20, 60, 100), 'salary': np.random.randint(5000, 15000, 100), 'col4': np.random.rand(100) # 其他无关列不影响计算 }), pd.DataFrame({ 'Gender': ['M', 'F']*50, 'Age': np.random.randint(20, 60, 100), 'salary': np.random.randint(5000, 15000, 100), 'col4': np.random.rand(100) }), pd.DataFrame({ 'Gender': ['M', 'F']*50, 'Age': np.random.randint(20, 60, 100), 'salary': np.random.randint(5000, 15000, 100), 'col4': np.random.rand(100) }) ] # 对应长度的权重向量 weights = [0.2, 0.3, 0.5]
步骤2:计算加权平均值
# 计算权重总和,避免除以0的异常 total_weight = sum(weights) if total_weight == 0: raise ValueError("权重总和不能为0,请调整权重值") # 初始化加权求和容器,仅保留目标列 weighted_sum = pd.DataFrame({ 'Age': np.zeros(100), 'salary': np.zeros(100) }) # 遍历每个DataFrame和对应权重,累加加权后的值 for df, w in zip(df_list, weights): weighted_sum['Age'] += df['Age'] * w weighted_sum['salary'] += df['salary'] * w # 计算最终加权平均值 weighted_avg_df = weighted_sum / total_weight # 可选:保留Gender列(假设各DataFrame的Gender列结构一致,取第一个DF的即可) weighted_avg_df['Gender'] = df_list[0]['Gender'] # 调整列顺序为原结构 weighted_avg_df = weighted_avg_df[['Gender', 'Age', 'salary']] # 查看结果 print(weighted_avg_df.head())
简洁版实现
如果追求代码简洁,可使用列表推导式结合pd.concat:
total_weight = sum(weights) if total_weight == 0: raise ValueError("权重总和不能为0") # 生成所有加权后的目标列,按行求和再除以权重总和 weighted_avg_df = pd.concat( [df[['Age', 'salary']] * w for df, w in zip(df_list, weights)], axis=1 ).groupby(level=0, axis=1).sum() / total_weight # 添加Gender列 weighted_avg_df['Gender'] = df_list[0]['Gender'] weighted_avg_df = weighted_avg_df[['Gender', 'Age', 'salary']]
注意事项
- 确保权重向量长度与DataFrame列表长度严格一致
- 必须处理权重总和为0的异常场景,避免运行时错误
- 若不同DataFrame的Gender列存在差异,需根据业务需求调整(比如取众数、忽略该列等)
- 所有DataFrame的行数必须相同(题目中已明确为100行,无需额外处理)
内容的提问来源于stack exchange,提问作者Leonard Zhang
相关产品推荐
相关产品推荐

