计算平均值等于给定值的连续子串

3

假设我有一些与足球相关的数据

Date   Home     Away  HomeGoal AwayGoal TotalGoal
2019   Arsenal  MU     5        1        6
2019   MCity    Liv    2        2        4
2019   MU       Liv    3        4        7
2019   MCity    MU     0        0        0

我想创建一列数据,显示该团队在最近2场比赛中的平均进球数。

例如,在最后一行,我想包括一列显示曼联在他们最近2场比赛中的平均进球数,即=(1 + 3)/2 = 2。

Python中是否有任何函数可以实现这一点?


所以这并不重要,无论团队是主场还是客场,对吧?那最后一行不应该是1.5吗?因为曼联先进了0球,然后又进了3个。3/2 = 1.5 - MattR
1
你能展示一下你期望的输出结果吗?使用DataFrame格式。 - sammywemmy
@MattR 不是问题,我打算找出该队在其最后N场比赛中的平均进球数。由于最后一行是结果数据,因此我不会将其包括在训练模型中。因此,曼联的平均进球应该是2个,这是正确的。 - Marco Lau
虽然你的回答很好,但请注意SO不是编程服务。你不能只是让别人为你编写代码,请阅读[mcve]。 - anishtain4
问题是什么,确切地说?你尝试过什么,做了任何研究吗?你似乎能够阅读英文,所以你可以阅读Pandas文档。 - AMC
显示剩余2条评论
2个回答

1
尝试这种方法:
根据主场和客场进球将其拆分成两个数据帧。
df1=df[['Date','Home','HomeGoal']]
df2 = df[['Date','Away','AwayGoal']]

all_dfs=[df1,df2]

给列命名

for dfs in all_dfs:
    dfs.columns = ['Date','Team', 'Goal']


将两个数据框拼接在一起。
new_df=pd.concat(all_dfs,ignore_index=True).reset_index(drop=True)


输出:
Date       Team    Goal
0   2019    Arsenal 5
1   2019    Mcity   2
2   2019    MU      3
3   2019    Mcity   0
4   2019    MU      1
5   2019    Liv     2
6   2019    Liv     4
7   2019    MU      0


上两场比赛的平均值:
new_df[new_df['Team'] == 'MU'].sort_values('Date')['Goal'][:2].sum()/2

关于球队在客场和主场比赛中的总进球数

new_df.groupby('Team')['Goal'].sum() 


输出为:

输出:

Team
Arsenal    5
Liv        6
MU         4
Mcity      2


你如何获取 OP 所要求的最后两场比赛的平均值? - XXavier

1

对于您的要求,您不关心球队是主场还是客场,只关心每场比赛进球的数量。请尝试以下方法:

# Rename the columns to make the unstacking operation a bit easier
# Always a good idea to specify an explicit `copy` when you intend
# to change the dataframe structure
>>> tmp = df[['Home', 'Away', 'HomeGoal', 'AwayGoal']].copy()

# Arrange the columns into a MultiIndex to make stacking easier
>>> tmp.columns = pd.MultiIndex.from_product([['Team', 'Goal'], ['Home', 'Away']])

# This is what `tmp` look like:

           Team      Goal     
      Home Away Home Away
0  Arsenal   MU    5    1
1    MCity  Liv    2    2
2       MU  Liv    3    4
3    MCity   MU    0    0

# And now the magic
>>> tmp.stack() \
        .groupby('Team').rolling(2).mean() \
        .groupby('Team').tail(1) \
        .droplevel([1,2])

# Result
         Goal
Team         
Arsenal   NaN
Liv       3.0
MCity     1.0
MU        1.5

这是它的工作原理:
  • stackHomeAway 转化为行,使得每个比赛都有两行数据,分别是 TeamsGoal
  • groupby('Team').rolling(2).mean() 获取每个球队最近两场比赛进球数的滚动平均值
  • groupby('Team').tail(1) 获取每个球队最近两场比赛进球数的平均值中的最后一个
  • 此时,过渡性数据框的索引有三个级别:球队名称、比赛编号和上一场比赛的主客场标识。我们只关心第一个级别,因此将删除其他两个级别。

这个问题值得回答吗? - AMC

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接