如何在Python中计算同类别下其他子类别产品的加权平均价格
解决方案
首先构造示例DataFrame:
import pandas as pd data = { 'category': ['A', 'A', 'A', 'B', 'B', 'B'], 'sub category': ['A1', 'A2', 'A3', 'B1', 'B2', 'B3'], 'price': [100, 110, 120, 90, 100, 95], 'revenue': [1000, 990, 890, 1200, 1100, 1050] } df = pd.DataFrame(data)
接下来按以下步骤计算目标列:
# 计算每个类别下的总营收、总价格营收乘积和 group_stats = df.groupby('category').agg( total_revenue=('revenue', 'sum'), total_price_revenue=('price', lambda x: (x * df.loc[x.index, 'revenue']).sum()) ) # 将分组统计结果合并回原表 df = df.merge(group_stats, on='category', how='left') # 计算排除当前子类别的加权平均价格 df['weighted_avg_excl_current'] = (df['total_price_revenue'] - df['price'] * df['revenue']) / (df['total_revenue'] - df['revenue']) # 可选:删除中间计算列 df = df.drop(['total_revenue', 'total_price_revenue'], axis=1)
最终输出结果:
category sub category price revenue weighted_avg_excl_current 0 A A1 100 1000 114.834395 1 A A2 110 990 109.521739 2 A A3 120 890 104.975124 3 B B1 90 1200 97.604167 4 B B2 100 1100 92.432432 5 B B3 95 1050 94.878049
逻辑说明
核心逻辑是利用分组聚合先拿到每个类别下的全局总和,再通过总和减去当前行对应值的方式,快速得到排除当前子类别后的加权平均:
加权平均公式:(类别总价格营收乘积 - 当前行价格*营收) / (类别总营收 - 当前行营收)
内容的提问来源于stack exchange,提问作者sayan_sen
相关产品推荐
相关产品推荐

