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

如何不使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 05:18:00