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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 02:15:34