如何对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
相关产品推荐
相关产品推荐

