gpt4 book ai didi

python - Pandas - 使用 groupby 滚动平均值

转载 作者:行者123 更新时间:2023-12-03 22:09:56 24 4
gpt4 key购买 nike

我是 Pandas 的新手。
我有一个数据框,我正在查看 Horse 结果。
我试图在过去 30 天内为每匹马在列中获得位置完成结果的滚动平均值。这是数据框中两匹马的示例:

        Horse            Position  OR   RaceDate    Weight
125283 cookie ring 4 59.0 2016-04-25 52.272727
126134 a boy named sue 7 46.0 2016-05-31 54.090909
137654 a boy named sue 4 49.0 2017-01-25 57.727273
138434 a boy named sue 8 48.0 2017-02-04 55.909091
138865 a boy named sue 2 48.0 2017-02-10 51.363636
140720 a boy named sue 3 50.0 2017-03-10 54.545455
141387 a boy named sue 7 49.0 2017-03-22 59.545455
143850 cookie ring 11 54.0 2017-05-25 56.818182
144203 cookie ring 9 54.0 2017-06-03 50.000000

所以我需要对每匹马进行分组,然后应用滚动平均值 90 天。我正在通过调用以下内容来做:
df['PositionAv90D'] = df.set_index('RaceDate').groupby('Horse').rolling("90d")['Position'].mean().reset_index()

但这会返回一个包含 3 列的数据框,并且仍然索引到 Horse。这里的例子:
0          a b celebration 2011-08-24       3.000000
1 a b celebration 2011-09-15 4.500000
2 a b celebration 2012-05-29 4.000000
3 a beautiful dream 2016-10-21 2.333333
4 a big sky brewing 2008-04-11 2.000000
5 a big sky brewing 2008-07-08 7.500000
6 a big sky brewing 2008-08-11 10.000000
7 a big sky brewing 2008-09-20 9.000000
8 a big sky brewing 2008-12-30 4.333333
9 a big sky brewing 2009-01-21 3.666667
10 a big sky brewing 2009-02-20 3.777778

我需要一个索引与我的原始数据框相同的列。

你能帮我吗?

最佳答案

使用 set_index()将删除原来的索引,所以使用 reset_index()首先将创建一个名为“index”的新列,其中包含您的原始索引。然后在最后插入 reset_index()(它只是创建索引 0、1、2...等)使用 set_index('index')回到原来的

因此,如果您执行以下操作,我认为它会起作用:

df['PositionAv90D'] = df.reset_index().set_index('RaceDate').groupby('Horse').rolling("90d")['Position'].mean().set_index('index')

一个简单的数据样本可以很好地对其进行测试,根据您提供的内容重新创建它有点困难

编辑 1:

由于您正在切换索引,因此拆分起来更容易,请参见下文,我创建了一些示例数据,我认为这些数据与您得到的数据类似:
df = pd.DataFrame({'foo': ['A', 'A', 'A', 'B', 'B', 'B', 'C', 'C', 'C'],
'bar': [1, 1, 1, 2, 2, 2, 3, 3, 3],
'baz': [11, 12, 13, 14, 15, 16, 17, 18, 19]},
index = [14, 15, 16, 17, 18, 19, 20, 21, 22])

df.reset_index(inplace=True) # This gives us index 0,1,2... and a new col 'index'
df.set_index('baz', inplace=True) # Replace with date in yours
# This next bit does the groupby and rolling, which will give a df
# with a multi index of foo and baz, then reset_index(0) to remove the foo index level
# so that it matches the original df index so that you can add it as a new column
df['roll'] = df.groupby('foo')['bar'].rolling(3).sum().reset_index(0,drop=True)
df.reset_index(inplace=True) # brings baz back into the df as a column
df.set_index('index', inplace=True) # sets the index back to the original

这将在原始 df 中为您提供一个带有滚动值的新列。在我的示例中,您将有 NaN对于每组中的前 2 个值,因为窗口仅从 idx = 窗口大小开始。所以在你的情况下,每组的前 89 天将是 NaN .您可能需要添加一个额外的步骤来仅从生成的 DataFrame 中选择过去 30 天

关于python - Pandas - 使用 groupby 滚动平均值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55006336/

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