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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 19:57:05