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

如何对Pandas DataFrame按自定义权重实现分组聚合?

自定义加权聚合实现方案

核心思路

先按B、C字段分组,确保每个子组包含D=1、D=2、D=3的对应A值,再用指定权重计算加权和,实现批量自动化聚合。

实现步骤

  • 验证分组完整性:确认每个B-C子组包含所有D的取值,避免权重匹配出错
  • 编写自定义聚合函数:针对每个分组提取对应D的A值,按预设权重计算加权结果
  • 批量执行聚合:通过分组+函数调用的方式,自动处理所有子组

代码实现

import pandas as pd

# 构造示例数据
df1 = pd.DataFrame({'A' : [1,2,3], 'B' : ['X', 'Y', 'Z'], 'C' : ['XX', 'YY', 'ZZ'], 'D' : [1,1,1]})
df2 = pd.DataFrame({'A' : [2,3,4], 'B' : ['X', 'Y', 'Z'], 'C' : ['XX', 'YY', 'ZZ'], 'D' : [2,2,2]})
df3 = pd.DataFrame({'A' : [4,5,6], 'B' : ['X', 'Y', 'Z'], 'C' : ['XX', 'YY', 'ZZ'], 'D' : [3,3,3]})
df = pd.concat([df1, df2, df3], axis = 0, ignore_index = True)

# 定义权重映射:D值对应权重
weights = {1: 0.4, 2: 0.5, 3: 0.5}

def weighted_agg(group):
    # 按D值排序,确保与权重顺序匹配
    sorted_group = group.sort_values('D')
    # 计算加权和:遍历权重字典,提取对应D的A值相乘后累加
    weighted_total = sum(sorted_group[sorted_group['D'] == d]['A'].iloc[0] * w for d, w in weights.items())
    # 返回聚合结果,保留B、C字段
    return pd.Series({'A_weighted': weighted_total, 'B': group['B'].iloc[0], 'C': group['C'].iloc[0]})

# 按B、C分组执行聚合
result_df = df.groupby(['B', 'C'], as_index=False).apply(weighted_agg).reset_index(drop=True)

print(result_df)

输出结果

A_weighted  B   C
0         4.2  X  XX
1         5.3  Y  YY
2         6.4  Z  ZZ

批量场景适配说明

  • 函数自动遍历所有B-C子组,无需手动处理单个分组
  • 若实际数据存在D值缺失的子组,可在weighted_agg中添加异常处理(如跳过缺失组、填充默认值)
  • 权重可通过字典灵活调整,无需修改核心聚合逻辑

内容的提问来源于stack exchange,提问作者Brian Smith

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 07:24:22