首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Pandas计算头对头的统计数据

使用Pandas计算头对头的统计数据
EN

Stack Overflow用户
提问于 2020-06-15 12:15:13
回答 2查看 319关注 0票数 2

我有一个看起来像这样的DataFrame:

代码语言:javascript
复制
  home_team  away_team  score  home_goals  away_goals  winner
1  Arsenal    Chelsea    3-0        3          0       Arsenal
2  ManCity    Arsenal    1-1        1          1       draw
3  Chelsea    Arsenal    2-1        2          1       Chelsea
4  Arsenal    Chelsea    5-5        5          5       draw
5  Arsenal    ManCity    1-2        1          2       ManCity

我的问题是:如何计算阿森纳对另一支球队的平局输球/面对面的记录?

潜在的预期结果如下所示:

代码语言:javascript
复制
   team      opponent  games_played  wins  draws  losses  goals_scored  goals_conceded
1  Arsenal   Chelsea        3          1     1      1          9              7
2  Arsenal   ManCity        2          0     1      1          2              3

任何帮助都是非常感谢的。请注意,数据不是真实的(以防任何英超专家潜伏)!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-06-15 13:19:21

检查此代码:

代码语言:javascript
复制
import pandas as pd

df_in = pd.read_csv('data.csv')
df_out = pd.DataFrame(columns = ['team', 'opponent', 'games_played', 'wins', 'draws', 'losses', 'goals_scored', 'goals_conceded'])

team = 'Arsenal'

for index, row in df_in.iterrows():
    if row['home_team'] == team:
        opponent = row['away_team']
        if row['home_goals'] > row['away_goals']:
            win = 1
            draw = 0
            loss = 0
        elif row['home_goals'] < row['away_goals']:
            win = 0
            draw = 0
            loss = 1
        else:
            win = 0
            draw = 1
            loss = 0
        goals_scored = row['home_goals']
        goals_conceded = row['away_goals']
    else:
        opponent = row['home_team']
        if row['home_goals'] > row['away_goals']:
            win = 0
            draw = 0
            loss = 1
        elif row['home_goals'] < row['away_goals']:
            win = 1
            draw = 0
            loss = 0
        else:
            win = 0
            draw = 1
            loss = 0
        goals_scored = row['away_goals']
        goals_conceded = row['home_goals']

    games_played = 1



    if opponent not in df_out['opponent'].unique():
        match = pd.DataFrame({'team': team,
                              'opponent': opponent,
                              'games_played': games_played,
                              'wins': win,
                              'draws': draw,
                              'losses': loss,
                              'goals_scored': goals_scored,
                              'goals_conceded': goals_conceded},
                             index = [0])
        df_out = pd.concat([df_out, match], ignore_index = True)
    else:
        df_out.loc[df_out['opponent'] == opponent, 'games_played'] += games_played
        df_out.loc[df_out['opponent'] == opponent, 'wins'] += win
        df_out.loc[df_out['opponent'] == opponent, 'draws'] += draw
        df_out.loc[df_out['opponent'] == opponent, 'losses'] += loss
        df_out.loc[df_out['opponent'] == opponent, 'goals_scored'] += goals_scored
        df_out.loc[df_out['opponent'] == opponent, 'goals_conceded'] += goals_conceded

这段代码将以df_in的形式加载数据,并使用所需的数据创建df_out

输出:

代码语言:javascript
复制
      team opponent games_played wins draws losses goals_scored goals_conceded
0  Arsenal  Chelsea            3    1     1      1            9              7
1  Arsenal  ManCity            2    0     1      1            2              3
票数 2
EN

Stack Overflow用户

发布于 2020-06-15 12:50:55

首先,您需要复制数据并翻转主队/客场队,以获得您想要的球队/对手风格的统计数据。

这是因为每一场比赛你需要数两次,一次是赢家,一次是松散的。复制df并翻转字段,然后使用df.concat将数据放到一起。

现在你可以聚合

你应该集中在主场、客场和胜利者身上。数一数这一步中的线条和目标。使用df.groupby(dimensions).agg(metrics)

现在,您需要将索引重新设置为df,以便可以再次使用winner列。使用df.reset_index(inplace=True)来完成这一任务。

一旦实现了这一点,就可以创建新的win, loss, draw'列,在这里您可以将获胜者与home_team列或静态字符串“绘图”进行比较。

现在,您可以再次增加df,并对胜诉/输赢/抽签列进行汇总。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62388040

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档