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

Pandas按ID计算每日数量差值的实现问题求助

问题解决:计算每个ID跨日期的Qty差值

首先,生成目标DataFrame的代码:

import pandas as pd

df = pd.DataFrame({'date' : [*['2020-01-01']*3, *['2020-01-02']*3, *['2020-01-03']*3], 
                   'id' : ['A1', 'A2', 'A3']*3, 
                   'qty' : [50, 10, 20, 40, 10, 20, 40, 15, 25]
                  }).sort_values('date')

错误原因分析

你之前的代码把date和id一起作为分组键:

df['delta'] = df.groupby(['date', 'id'])['qty'].transform(lambda x: x.diff()).sort_index()

这样每个分组里只有单条数据(每个日期+ID的组合唯一),diff()无法计算前后差值,所以结果全为NaN。

正确实现代码

要计算每个ID在不同日期的Qty差值,只需要按id分组,然后对qty列执行diff()即可:

# 生成delta列(如果需要和期望结果列名一致,将'delta'改为'variation')
df['delta'] = df.groupby('id')['qty'].diff()

验证结果

执行后得到的DataFrame如下:

date  id  qty  delta
0  2020-01-01  A1   50    NaN
1  2020-01-01  A2   10    NaN
2  2020-01-01  A3   20    NaN
3  2020-01-02  A1   40  -10.0
4  2020-01-02  A2   10    0.0
5  2020-01-02  A3   20    0.0
6  2020-01-03  A1   40    0.0
7  2020-01-03  A2   15    5.0
8  2020-01-03  A3   25    5.0

完全匹配你的期望结果。

补充说明

  • groupby('id')确保仅在同一个ID的范围内计算差值
  • diff()默认计算当前行与前一行的差值,由于原DataFrame已按date排序,每个ID内的数据按日期顺序排列,正好对应跨日期的变化
  • 如果需要保留整数类型,可使用:df['delta'] = df.groupby('id')['qty'].diff().fillna(pd.NA).astype('Int64')

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 17:52:43