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
相关产品推荐
相关产品推荐

