Pandas:固定间隔差值计算适配可变间隔,无足够记录时使用最早记录
解决客户CAV值差值计算的问题
嘿,我来帮你搞定这个需求!你原来用的df.groupby('Client')['CAV'].diff(-5)只能处理存在6个月前记录的情况,没有对应记录时就返回NaN,而我们需要用客户最早的CAV值来补全计算,下面是具体的解决步骤:
步骤1:确保数据排序正确
首先要保证每个客户的记录是按月份降序排列的(你的原始数据已经是这样,但显式排序能避免后续出错):
df = df.sort_values(['Client', 'Month'], ascending=[True, False])
步骤2:计算目标差值
我们需要对每个客户分组后,先获取6个月前的CAV值(用shift(-5)),当没有对应记录时,用该客户最早的CAV值(组内最后一条记录的CAV)填充,再用当前CAV减去这个值得到差值:
df['CAV_diff'] = df.groupby('Client')['CAV'].apply( lambda x: x - x.shift(-5).fillna(x.iloc[-1]) )
代码解释
x.shift(-5):将当前客户组的CAV列向后偏移5行,对应“6个月前”的记录(比如当前行是最新月份,往后数5行就是间隔6个月的记录).fillna(x.iloc[-1]):当偏移后没有对应值(即记录不足6个月)时,用该客户最早的CAV值(组内最后一行的CAV)填充- 最终用当前CAV值减去处理后的偏移值,得到我们需要的差值
验证结果
运行这段代码后,你就能得到完全符合期望的结果:
| Client | Month | CAV | CAV_diff |
|---|---|---|---|
| A | 2021-09 | 30 | 25 |
| A | 2021-08 | 20 | 10 |
| A | 2021-07 | 10 | 0 |
| A | 2021-06 | 5 | -5 |
| A | 2021-05 | 10 | 0 |
| A | 2021-04 | 5 | -5 |
| A | 2021-03 | 10 | 0 |
| B | 2021-08 | 50 | 20 |
| B | 2021-07 | 10 | -20 |
| B | 2021-06 | 30 | 0 |
内容的提问来源于stack exchange,提问作者Jenny Jing Yu
相关产品推荐
相关产品推荐

