[英]Create rolling average pandas
I have a dataset of esports data like this:我有一个这样的电子竞技数据集:
(done using pd.to_clipboard()
(使用
pd.to_clipboard()
完成
Week Team Vs Team Points Vs Points
0 1 Team1 Team2 94 67
1 1 Team3 Team4 51 83
2 1 Team5 Team6 74 96
3 1 Team2 Team1 67 94
4 1 Team4 Team3 83 51
5 1 Team6 Team5 96 74
6 2 Team2 Team6 63 76
7 2 Team1 Team3 90 84
8 2 Team4 Team5 68 56
9 2 Team6 Team2 76 63
10 2 Team3 Team1 84 90
11 2 Team5 Team4 56 68
12 3 Team5 Team2 63 74
13 3 Team1 Team6 63 99
14 3 Team3 Team4 50 75
15 3 Team2 Team5 74 63
16 3 Team6 Team1 99 63
17 3 Team4 Team3 75 50
18 4 Team6 Team4 78 91
19 4 Team5 Team1 70 71
20 4 Team2 Team3 99 74
21 4 Team4 Team6 91 78
22 4 Team1 Team5 71 70
23 4 Team6 Team4 78 91
I want to create a dataframe that essentially, for each team, every week, creates a rolling X game average of their points scored.我想创建一个 dataframe,它基本上每周为每个团队创建他们得分的滚动 X 游戏平均值。 (X could be 2, 3, 4, etc).
(X 可以是 2、3、4 等)。 A few notes:
一些注意事项:
I tried to create this functionality using below code:我尝试使用以下代码创建此功能:
import pandas as pd
x = pd.read_clipboard()
teams = list(set(x['Team'].to_list() + (x['Vs'].to_list())))
res = []
for team in teams:
temp = x.loc[x['Team']==team]
temp.sort_values(by=['Week'], inplace=True)
temp.groupby(['Week']).rolling(2).mean()
res.append(temp)
res_df = pd.concat(res)
However, it yields results like:但是,它会产生如下结果:
Week Team Vs Team Points Vs Points
1 1 Team3 Team4 51 83
10 2 Team3 Team1 84 90
14 3 Team3 Team4 50 75
4 1 Team4 Team3 83 51
8 2 Team4 Team5 68 56
17 3 Team4 Team3 75 50
21 4 Team4 Team6 91 78
2 1 Team5 Team6 74 96
11 2 Team5 Team4 56 68
12 3 Team5 Team2 63 74
19 4 Team5 Team1 70 71
5 1 Team6 Team5 96 74
9 2 Team6 Team2 76 63
16 3 Team6 Team1 99 63
18 4 Team6 Team4 78 91
23 4 Team6 Team4 78 91
0 1 Team1 Team2 94 67
7 2 Team1 Team3 90 84
13 3 Team1 Team6 63 99
22 4 Team1 Team5 71 70
3 1 Team2 Team1 67 94
6 2 Team2 Team6 63 76
15 3 Team2 Team5 74 63
20 4 Team2 Team3 99 74
While I would like for it to look like:虽然我希望它看起来像:
Week Team 2Game_Average_Points
0 1 Team1
1 1 Team2
2 1 Team3
3 1 Team4
4 1 Team5
5 1 Team6
6 2 Team1 94.0
7 2 Team2 67.0
8 2 Team3 51.0
9 2 Team4 83.0
10 2 Team5 74.0
11 2 Team6 96.0
12 3 Team1 92.0
13 3 Team2 65.0
14 3 Team3 67.5
15 3 Team4 78.5
16 3 Team5 65.0
17 3 Team6 86.0
18 4 Team1 76.5
19 4 Team2 68.5
20 4 Team3 67.5
21 4 Team4 78.5
22 4 Team5 59.5
23 4 Team6 87.5
What am I doing wrong?我究竟做错了什么? How can I achieve my desired result?
我怎样才能达到我想要的结果?
>>> roll = df.groupby('Team')[['Team Points']].apply(lambda x: x.rolling(2).mean())
>>> df[['Week', 'Team']].join(roll.rename('2Game_Average_Points')
Week Team 2Game_Average_Points
0 1 Team1 NaN
1 1 Team3 NaN
2 1 Team5 NaN
3 1 Team2 NaN
4 1 Team4 NaN
5 1 Team6 NaN
6 2 Team2 65.0
7 2 Team1 92.0
8 2 Team4 75.5
9 2 Team6 86.0
10 2 Team3 67.5
11 2 Team5 65.0
12 3 Team5 59.5
13 3 Team1 76.5
14 3 Team3 67.0
15 3 Team2 68.5
16 3 Team6 87.5
17 3 Team4 71.5
18 4 Team6 88.5
19 4 Team5 66.5
20 4 Team2 86.5
21 4 Team4 83.0
22 4 Team1 67.0
23 4 Team6 78.0
Team Points
, not using Vs Points
since every game appears twice, but you could add your other features to the list)Team Points
,因为每场比赛都出现两次,所以不使用Vs Points
,但您可以将其他功能添加到列表中) As underlined in another answer this could use the slightly denser notation groupby().rolling()
, thus in this case:正如在另一个答案中强调的那样,这可以使用稍微密集的符号
groupby().rolling()
,因此在这种情况下:
>>> roll = df.groupby('Team', as_index=False)[['Team Points']].rolling(2).mean()
NB.注意。 as you had ambiguous column names, I used
Week TeamA TeamB PointsA PointsB
因为您的列名不明确,所以我使用了
Week TeamA TeamB PointsA PointsB
I don't agree with the values in your output, but if you want to calculate a rolling average per group, you can do:我不同意你 output 中的值,但如果你想计算每组的滚动平均值,你可以这样做:
df['2Game_Average_Points'] = (df.groupby('TeamA')['PointsA']
.rolling(2).mean()
.sort_index(level=1).values
)
output: output:
Week TeamA TeamB PointsA PointsB 2Game_Average_Points
0 1 Team1 Team2 94 67 NaN
1 1 Team3 Team4 51 83 NaN
2 1 Team5 Team6 74 96 NaN
3 1 Team2 Team1 67 94 NaN
4 1 Team4 Team3 83 51 NaN
5 1 Team6 Team5 96 74 NaN
6 2 Team2 Team6 63 76 65.0
7 2 Team1 Team3 90 84 92.0
8 2 Team4 Team5 68 56 75.5
9 2 Team6 Team2 76 63 86.0
10 2 Team3 Team1 84 90 67.5
11 2 Team5 Team4 56 68 65.0
12 3 Team5 Team2 63 74 59.5
13 3 Team1 Team6 63 99 76.5
14 3 Team3 Team4 50 75 67.0
15 3 Team2 Team5 74 63 68.5
16 3 Team6 Team1 99 63 87.5
17 3 Team4 Team3 75 50 71.5
18 4 Team6 Team4 78 91 88.5
19 4 Team5 Team1 70 71 66.5
20 4 Team2 Team3 99 74 86.5
21 4 Team4 Team6 91 78 83.0
22 4 Team1 Team5 71 70 67.0
23 4 Team6 Team4 78 91 78.0
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.