Как я могу рассчитать накопленные баллы? - PullRequest
2 голосов
/ 25 января 2020

У меня есть следующий фрейм данных:

HomeTeam = ["A", "B", "B", "D", "C", "A", "C", "D"]
AwayTeam = ["C", "D", "A", "C", "B", "D", "A", "B"]
Result = ["HT", "AT", "HT", "HT", "D", "AT", "D", "AT"]
Round = [1,1,2,2,3,3,4,4]

dict = {'HomeTeam': HomeTeam, 'AwayTeam': AwayTeam, 'Result': Result, 'Round': Round}  

df = pd.DataFrame(dict) 

df

enter image description here

Где Результат:
"HT" = HomeTeam выиграл -> HomeTeam +3, AwayTeam 0
"AT" = AwayTeam выиграл -> HomeTeam 0, AwayTeam +3
"D" = Ничья -> HomeTeam +1, AwayTeam +1

Мне нужно создать две разные колонки:
1) Совокупные очки домашней команды : она содержит общее количество очков, полученных от домашней команды до этого матча.
2) Совокупные очки команды гостей : она содержит общее количество очков, полученных от команды гостей за этот матч.

Я использую Python, но мой l oop не работает идеально.


Это мой ожидаемый результат:

enter image description here

Ответы [ 2 ]

2 голосов
/ 25 января 2020

Раствор без петель и гибкий исключительно с Pandas

Используйте DataFrame.melt с np.select (чтобы получить очки ) и DataFrame.pivot_table для возврата кадра в исходное sape:

df = df.join(df.reset_index()
               .melt(['index','Round','Result'],value_name = 'Team',var_name = 'H/A')
               .sort_values('index')
               .assign(Points = lambda x:np.select([ x['Result'].eq('D'),
                                                     x['H/A'].eq('HomeTeam')
                                                             .mul(x['Result'].eq('HT'))|
                                                     x['H/A'].eq('AwayTeam')
                                                             .mul(x['Result'].eq('AT'))],
                                                    [1,3],
                                                    default = 0))
               .assign(CumPoints = lambda x: x.groupby('Team')
                                              .Points
                                              .cumsum()
                                              .groupby(x['Team'])
                                              .shift(fill_value = 0))
               .pivot_table(index = 'index',
                            columns = 'H/A',
                            values = 'CumPoints'
                            fill_value = 0)
               .sort_index(axis = 1,ascending = False)
               .add_prefix('CumulativePoints')

            )
print(df)

Выход

  HomeTeam AwayTeam Result  Round  CumulativePointsHomeTeam  CumulativePointsAwayTeam
0        A        C     HT      1                         0                         0 
1        B        D     AT      1                         0                         0 
2        B        A     HT      2                         0                         3 
3        D        C     HT      2                         3                         0 
4        C        B      D      3                         0                         3 
5        A        D     AT      3                         3                         6 
6        C        A      D      4                         1                         3 
7        D        B     AT      4                         9                         4 
1 голос
/ 25 января 2020

Добавьте это к своему коду:

cpts ={'A':0,'B':0,'C':0,'D':0}

cpts_ht = []
cpts_at = []
for i in range(len(df.Result)):
    cpts_ht.append(cpts[df.HomeTeam[i]])
    cpts_at.append(cpts[df.AwayTeam[i]])

    if df.Result[i]=='HT':
        cpts[df.HomeTeam[i]]+=3
    elif df.Result[i]=='AT':
        cpts[df.AwayTeam[i]]+=3
    else:
        cpts[df.HomeTeam[i]]+=1
        cpts[df.AwayTeam[i]]+=1

df['cummulative_home'] = cpts_ht
df['cummulative_away'] = cpts_at

print(df)

Вывод:

  HomeTeam AwayTeam Result  Round  cummulative_home  cummulative_away
0        A        C     HT      1                 0                 0
1        B        D     AT      1                 0                 0
2        B        A     HT      2                 0                 3
3        D        C     HT      2                 3                 0
4        C        B      D      3                 0                 3
5        A        D     AT      3                 3                 6
6        C        A      D      4                 1                 3
7        D        B     AT      4                 9                 4
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...