创建带有每个独特团队获胜顺序计数器的列表

2024-04-26 07:42:25 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我有一个数据集,其中包含了主客场球队和主客场球队,并显示了哪支球队赢得了比赛。像这样:

Home_team     Away_Team     Home_Win     Away_Win    gameID
   TB            CLB            1            0         1
   NY            ARZ            0            1         2
   EDM           CAN            1            0         3
   NY            TB             0            1         4
   NY            CLB            1            0         5
   TB            NY             1            0         6

你如何写一个顺序计数器来计算一支球队在前几场比赛中的总胜利数,而不管球队是主场还是客场。所以对于配子ID:1,每队总共有0场胜利。 自从TB赢了第一场比赛后,他们现在在第二场比赛之前总共赢了1场(配子ID:4)纽约之前一共赢了0场。你知道吗

所以数据应该是这样的:(AT=客场球队,HT=主场球队)

Home_team     Away_Team     Home_Win     Away_Win    gameID    HT'sTotWins      AT'sTotWins
   TB            CLB            1            0         1            0               0
   NY            ARZ            0            1         2            0               0
   EDM           CAN            1            0         3            0               0
   NY            TB             0            1         4            0               1
   NY            CLB            1            0         5            0               0
   TB            NY             1            0         6            2               1

我读过一些关于GroupBy.cumcount()的书,但我不知道如何编写条件。 我希望我没有不清楚我想做什么,如果我是请告诉我。你知道吗


Tags: 数据homecanwintbteamclbedm
2条回答

为了更具启发性,我把你的源数据扩展到了10个游戏 以及“缩短”列名,使打印输出不那么宽。你知道吗

因此,脚本的第一部分,生成源数据帧如下:

import pandas as pd

# Source data
df = pd.DataFrame(data=[
    [ 1, 'TB',  'CLB', 1], [ 2, 'NY',  'ARZ', 0],
    [ 3, 'EDM', 'CAN', 1], [ 4, 'NY',  'TB',  0],
    [ 5, 'NY',  'CLB', 1], [ 6, 'TB',  'NY',  1],
    [ 7, 'ARZ', 'CAN', 1], [ 8, 'ARZ', 'TB',  0],
    [ 9, 'NY',  'EDM', 1], [10, 'TB',  'CAN', 1]],
    columns=['gameID', 'HomeTeam', 'AwayTeam', 'HomeWin']).set_index('gameID')
df['AwayWin'] = 1 - df['HomeWin']

因为获胜的队伍可以同时在HomeTeamAwayTeam中,所以不存在 使用单个groupby的简单方法。 您必须使用它两次,生成每个结果列。你知道吗

要生成HTWins(主队的总胜利数),请使用:

hWin = df.HomeTeam.where(df.HomeWin == 1, df.AwayTeam)
hCnt = hWin.groupby(hWin).cumcount()
df['HTWins'] = hCnt.where(df.HomeWin == 1, 0)

要生成ATWins(客场球队的总胜利数),请使用:

aWin = df.AwayTeam.where(df.AwayWin == 1, df.HomeTeam)
aCnt = aWin.groupby(aWin).cumcount()
df['ATWins'] = aCnt.where(df.AwayWin == 1, 0)

当您print(df)时,您将得到:

       HomeTeam AwayTeam  HomeWin  AwayWin  HTWins  ATWins
gameID                                                    
1            TB      CLB        1        0       0       0
2            NY      ARZ        0        1       0       0
3           EDM      CAN        1        0       0       0
4            NY       TB        0        1       0       1
5            NY      CLB        1        0       0       0
6            TB       NY        1        0       2       0
7           ARZ      CAN        1        0       1       0
8           ARZ       TB        0        1       0       3
9            NY      EDM        1        0       1       0
10           TB      CAN        1        0       4       0

要帮助理解此脚本的工作方式,请运行每个指令 单独打印结果。你知道吗

也许有一种更“优雅”的方式来做这件事,但我只是把事情分成for循环,然后这样做。你知道吗

import copy
import pandas as pd

df = pd.read_csv('sports_data.csv', header=0, delim_whitespace=True)
df["HT'sTotWins"] = 0
df["AT'sTotWins"] = 0

homeWinsAwayWins = {}
homeAwayCount = {'home':0, 'away':0}

for index, row in df.iterrows():
    homeTeam = row['Home_team']
    awayTeam = row['Away_Team']

    if homeTeam not in homeWinsAwayWins:
        homeWinsAwayWins[homeTeam] = copy.deepcopy(homeAwayCount)
    if awayTeam not in homeWinsAwayWins:
        homeWinsAwayWins[awayTeam] = copy.deepcopy(homeAwayCount)

    df.loc[index,"HT'sTotWins"] = homeWinsAwayWins[homeTeam]['home'] + homeWinsAwayWins[homeTeam]['away']
    df.loc[index,"AT'sTotWins"] = homeWinsAwayWins[awayTeam]['home'] + homeWinsAwayWins[awayTeam]['away']

    homeWin = row['Home_Win']
    awayWin = row['Away_Win']
    if homeWin:
        homeWinsAwayWins[homeTeam]['home'] += 1
    elif awayWin:
        homeWinsAwayWins[awayTeam]['away'] += 1

print(df)

它能打印出你想要的。你知道吗

相关问题 更多 >