Создать список с последовательным счетчиком побед каждой уникальной команды - PullRequest
0 голосов
/ 11 января 2019

Скажем, у меня есть набор данных, который содержит home_team, away_team и столбцы home_win, away_win, в которых указывается, какая команда выиграла игру. Как это:

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

Как вы пишете последовательный счетчик, который подсчитывает общий выигрыш команд с учетом предыдущих игр и независимо от того, была ли команда дома или в гостях. Таким образом, для gameID: 1 каждая команда имеет всего 0 побед. Так как TB выиграл первую игру, у них теперь есть 1 выигрыш во второй игре против NY (gameID: 4), а у NY в общей сложности 0 предыдущих побед.

Таким образом, данные будут выглядеть так: (AT = Away_Team, HT = Home_Team)

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(), но не знаю, как написать условия. Я надеюсь, что мне неясно, что я хочу сделать, если я скажу, пожалуйста.

Ответы [ 2 ]

0 голосов
/ 11 января 2019

Возможно, для этого есть более «изящный» способ панд, но я бы просто разбил все на циклы и пошел по этому пути.

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)

Он печатает, что вы хотите.

0 голосов
/ 11 января 2019

Чтобы быть более поучительным, я расширил ваши исходные данные до 10 игр и «сокращенные» имена столбцов, чтобы сделать распечатку не такой широкой.

Итак, первая часть скрипта, генерирующая источник DataFrame, выглядит следующим образом:

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']

Поскольку команда-победитель может быть как в HomeTeam, так и в AwayTeam, нет Простой способ использования одного 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

Чтобы помочь понять, как работает этот скрипт, запустите каждую инструкцию отдельно и распечатайте результат.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...