我有一个像这样的数据框:
data = {
'ID': [1, 1, 2, 1, 2, 1, 1, 2, 2, 2, 1, 2, 2, 1],
'timestamp': pd.date_range(start='1/1/2023', periods=14, freq='D'),
'value': [11, 22, 33, 44, 55, 66, 77, 88, 99, 11, 22, 33, 44, 55]
}
我的实际数据框包含数百万行。 我对时间戳列进行排序,因此当您查看原始数据帧时,ID 列会散布。
我想按 ID 分组并找出每一行与前 3 行之间的差异。 我目前的工作方式如下:
# Sort by ID and timestamp
df = df.sort_values(by=['ID', 'timestamp'])
# Group by 'ID' and calculate the difference with the 5th previous row
df['value_diff'] = df.groupby('ID', group_keys=False)['value'].apply(lambda x: x - x.shift(3))
然而,由于我的实际数据帧很大,所以需要相当多的时间。我还读到使用 lambda 很慢。 有没有更优雅的方法来实现这一点?
groupby.shift
,然后减去原来的列:
df['value_diff'] = df['value'] - df.groupby('ID')['value'].shift(3)
输出:
ID timestamp value value_diff
0 1 2023-01-01 11 NaN
1 1 2023-01-02 22 NaN
3 1 2023-01-04 44 NaN
5 1 2023-01-06 66 55.0
6 1 2023-01-07 77 55.0
10 1 2023-01-11 22 -22.0
13 1 2023-01-14 55 -11.0
2 2 2023-01-03 33 NaN
4 2 2023-01-05 55 NaN
7 2 2023-01-08 88 NaN
8 2 2023-01-09 99 66.0
9 2 2023-01-10 11 -44.0
11 2 2023-01-12 33 -55.0
12 2 2023-01-13 44 -55.0