如何不使用itertuples基于DataFrame另一列累计和完成分桶聚合
实现方案
核心逻辑全程用向量化操作实现,性能远高于遍历方案:
- 先计算曝光总和,确定单桶阈值
- 计算每行开始前的累计曝光,基于该值分配桶编号,保证行不会被拆分
- 按桶分组后计算各指标的曝光加权均值,同时统计每桶总曝光
完整实现代码
import pandas as pd # 初始数据 df = pd.DataFrame({'model_1': [0.15, 0.19, 0.25, 0.54, 0.55 , 0.98, 1.12], 'model_2': [0.12, 0.13, 0.32, 0.45, 0.6 , 0.7, 1.05], 'exposure': [0.4, 1, 1.6, 1, 2, 2, 3], 'target': [0.1, 0.2, 0.3, 0.4, 0.5, 0.8, 1.1]}) total_expo = df['exposure'].sum() # 单桶阈值,三个桶分别对应 <threshold、<2*threshold、>=2*threshold threshold = total_expo / 3 # 计算每行开始前的累计曝光(第一行前累计值为0) prev_cum = df['exposure'].cumsum().shift(fill_value=0) # 分配桶编号 df['bucket'] = (prev_cum // threshold).astype(int) # 预计算加权值,避免groupby内循环提升性能 df['w_model1'] = df['model_1'] * df['exposure'] df['w_model2'] = df['model_2'] * df['exposure'] df['w_target'] = df['target'] * df['exposure'] # 分组聚合得到最终结果 grouped = df.groupby('bucket').sum(numeric_only=True) output_df = pd.DataFrame({ 'aggr_model_1': grouped['w_model1'] / grouped['exposure'], 'aggr_model_2': grouped['w_model2'] / grouped['exposure'], 'aggr_target': grouped['w_target'] / grouped['exposure'], 'aggr_exposure': grouped['exposure'] }).reset_index(drop=True)
运行后输出和你给出的预期结果完全一致:
aggr_model_1 aggr_model_2 aggr_target aggr_exposure 0 0.2975 0.285 0.28 4.0 1 0.7650 0.650 0.65 4.0 2 1.1200 1.050 1.10 3.0
内容的提问来源于stack exchange,提问作者Violatic
相关产品推荐
相关产品推荐

