Pandas dataframe按累计消费阈值向量化分桶聚合的实现问题
实现方案
前提:你的DataFrame已经按日期升序排序完成。
核心逻辑
通过累计消费计算临时除数后偏移一位得到桶号,完全满足「单条消费导致累计超阈值仍归入当前桶」的规则,全程为向量化操作,无手动循环。
代码示例
import pandas as pd import numpy as np # 设定满减阈值X,替换为你的实际数值 X = 100 # 1. 计算累计消费 df['cum_money'] = df['money_spent'].cumsum() # 2. 计算临时除数,减去极小值避免刚好等于X时被算入下一个桶 df['div'] = (df['cum_money'] - 1e-12) // X # 3. 偏移一位得到正确桶号:满阈值的当前行归为当前桶,下一行开始新桶 df['bucket'] = df['div'].shift(1, fill_value=0).astype(int) # 4. 按桶聚合指标 result = df.groupby('bucket').agg( 首条日期=('date', 'first'), 就餐次数平均值=('eat_times', 'mean'), 体重最小值=('weight', 'min'), 体重最大值=('weight', 'max') ).reset_index(drop=True) # 可选:删除生成的中间字段 df = df.drop(columns=['cum_money', 'div', 'bucket'])
说明
- 之前用
pd.cut不符合预期的原因是pd.cut按固定区间拆分,累计超过X的行会被直接划入下一个区间,和需求规则不符。 - 百万行数据集用这套方案耗时通常在10秒以内,性能远高于手动循环。
内容的提问来源于stack exchange,提问作者Joe
相关产品推荐
相关产品推荐

