如何在pandas groupby分组后应用函数获取关联列唯一值并计算聚合结果
问题原因
你之前的写法分别对column_b和column_c取唯一值,没有绑定两列的对应关系,无法保证两个序列的元素一一匹配,当同一个column_b值对应多个column_c、或者两列唯一值数量不一致时都会出现计算错误。
解决代码
写法1:分组内去重计算
import pandas as pd import numpy as np g = df.groupby("column_a") def calc_weighted_avg(group): # 先获取当前分组内column_b和column_c的唯一配对,避免重复计算 unique_pairs = group[["column_b", "column_c"]].drop_duplicates() total_weight = unique_pairs["column_b"].sum() weighted_sum = (unique_pairs["column_b"] * unique_pairs["column_c"]).sum() return weighted_sum / total_weight result = g.apply(calc_weighted_avg)
运行后针对你的示例数据,输出结果约为4.166,符合预期计算逻辑。
写法2:提前全局去重(适合大数据量场景)
如果你的数据量较大,可以先全局去重再分组计算,减少分组内的重复计算开销:
# 提前对所有(b,c)配对按分组维度去重 df_unique = df[["column_a", "column_b", "column_c"]].drop_duplicates() result = df_unique.groupby("column_a").apply( lambda x: (x["column_b"] * x["column_c"]).sum() / x["column_b"].sum() )
内容的提问来源于stack exchange,提问作者JA-pythonista
相关产品推荐
相关产品推荐

