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

如何用Pandas按客户分组计算当前存款日期前的滚动均值?

计算客户截至当前日期前DPD滚动均值的最优方法

针对你需求里的PreviousMean列计算(客户当前存款日期不含当日的DPD滚动均值,首条记录取0),结合Pandas的高效分组聚合特性,最优方案可以分为以下几个步骤,既保证准确性又兼顾大数据量下的性能:

步骤1:预处理数据类型

首先要确保日期和数值类型正确,避免后续计算出错:

import pandas as pd

# 初始化你的DataFrame
df = pd.DataFrame([['John', '1/1/2017','10'], ['John', '2/2/2017','15'], ['John', '2/2/2017','20'], ['John', '3/3/2017','30'], ['Sue', '1/1/2017','10'], ['Sue', '2/2/2017','15'], ['Sue', '3/2/2017','20'], ['Sue', '3/3/2017','7'], ['Sue', '4/4/2017','20'] ], columns=['Customer', 'Deposit_Date','DPD'])

# 转换DPD为整数类型,Deposit_Date为日期类型
df['DPD'] = df['DPD'].astype(int)
df['Deposit_Date'] = pd.to_datetime(df['Deposit_Date'])

步骤2:按客户+日期聚合统计

因为同一客户可能在同一日期有多条存款记录,我们需要先按Customer和Deposit_Date分组,统计每个日期的DPD总和与记录数:

daily_agg = df.groupby(['Customer', 'Deposit_Date']).agg(
    total_dpd=('DPD', 'sum'),
    record_count=('DPD', 'size')
).reset_index()

步骤3:计算历史累计值并偏移

对每个客户,计算截至当前日期的累计DPD总和与累计记录数,然后偏移一行(得到当前日期之前的所有历史累计值):

# 按客户分组计算累计总和与累计记录数,shift(1)获取前序日期的累计值
daily_agg['prev_total'] = daily_agg.groupby('Customer')['total_dpd'].cumsum().shift(1)
daily_agg['prev_count'] = daily_agg.groupby('Customer')['record_count'].cumsum().shift(1)

步骤4:计算PreviousMean并合并回原表

根据历史累计值计算均值,无历史记录时设为0,最后将结果合并回原始DataFrame:

# 计算均值,无历史数据时返回0
daily_agg['PreviousMean'] = daily_agg.apply(
    lambda row: row['prev_total'] / row['prev_count'] if pd.notna(row['prev_count']) and row['prev_count'] > 0 else 0,
    axis=1
)

# 将结果合并回原始DataFrame
df = df.merge(daily_agg[['Customer', 'Deposit_Date', 'PreviousMean']], on=['Customer', 'Deposit_Date'], how='left')

为什么这是最优方法?

  • 性能高效:全程使用Pandas的向量式聚合操作,避免了逐行循环的低效问题,适合处理大规模数据集;
  • 逻辑准确:严格区分了「当前日期」和「历史日期」,同一日期的多条记录会共享相同的历史均值,完全符合需求;
  • 易于维护:步骤拆分清晰,后续如果需要调整规则(比如空值替代为NaN),只需修改最后一步的lambda逻辑即可。

最终得到的df中,PreviousMean列就完全符合你的要求:比如John的第一条记录均值为0,2/2/2017的两条记录均值都是10(来自1/1/2017的DPD),3/3/2017的记录均值为15((10+15+20)/3)。

内容的提问来源于stack exchange,提问作者Reddspark

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:06:36