gpt4 book ai didi

python - 在 Pandas 中使用 groupby、shift 和 rolling

转载 作者:行者123 更新时间:2023-12-04 15:25:54 36 4
gpt4 key购买 nike

我正在尝试计算组内的滚动平均值。对于此任务,我需要上面各行的滚动平均值,所以我认为最简单的方法是使用 shift(),然后执行 rolling()。问题是 shift() 移动了先前组中的数据,这使得第 2 组和第 3 组中的第一行不正确。 “ma”列的第 4 行和第 7 行应包含 NaN。我该如何实现?

import pandas as pd

df = pd.DataFrame(
{"Group": [1, 2, 3, 1, 2, 3, 1, 2, 3],
"Value": [2.5, 2.9, 1.6, 9.1, 5.7, 8.2, 4.9, 3.1, 7.5]
})

df = df.sort_values(['Group'])
df.reset_index(inplace=True)

df['ma'] = df.groupby('Group', as_index=False)['Value'].shift(1).rolling(3, min_periods=1).mean()

print(df)

我明白了:

   index  Group  Value    ma
0 0 1 2.5 NaN
1 3 1 9.1 2.50
2 6 1 4.9 5.80
3 1 2 2.9 5.80
4 4 2 5.7 6.00
5 7 2 3.1 4.30
6 2 3 1.6 4.30
7 5 3 8.2 3.65
8 8 3 7.5 4.90

我尝试了几个类似问题的答案,但似乎没有任何效果。

最佳答案

如果我正确理解问题,那么您需要的解决方案可以通过以下 2 个步骤实现:

df['sa'] = df.groupby('Group', as_index=False)['Value'].transform(lambda x: x.shift(1))

df['ma'] = df.groupby('Group', as_index=False)['sa'].transform(lambda x: x.rolling(3, min_periods=1).mean())

我得到以下输出,其中“ma”是所需的列

index   Group   Value   sa  ma
0 0 1 2.5 NaN NaN
1 3 1 9.1 2.5 2.5
2 6 1 4.9 9.1 5.8
3 1 2 2.9 NaN NaN
4 4 2 5.7 2.9 2.9
5 7 2 3.1 5.7 4.3
6 2 3 1.6 NaN NaN
7 5 3 8.2 1.6 1.6
8 8 3 7.5 8.2 4.9

编辑:一个groupby的例子

def shift_ma(x):
return x.shift(1).rolling(3, min_periods=1).mean()

df['ma'] = df.groupby('Group', as_index=False)['Value'].apply(shift_ma).reset_index(drop=True)

关于python - 在 Pandas 中使用 groupby、shift 和 rolling,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62236170/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com