不使用 lambda 函数的 Groupby 和 shift

问题描述 投票:0回答:1

我有一个像这样的数据框:

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 很慢。 有没有更优雅的方法来实现这一点?

python python-3.x pandas
1个回答
0
投票

不要用apply,直接用

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
© www.soinside.com 2019 - 2024. All rights reserved.