Как сбросить функцию переката () в Pandas для каждого значения индекса? - PullRequest
0 голосов
/ 06 марта 2020

Я пытаюсь подвести итоги каждой победы или победы каждой команды из моего набора данных перед каждой игрой.

Вот мой исходный кадр данных:

date              Home     Visitors    Result
2020-01-01        Paris     Lisbon       1
2020-01-03        Madrid    London       0
2020-01-13        Lisbon    Madrid       1
2020-01-14        London    Paris        1
2020-01-16        Lisbon    London       0 
2020-01-18        Paris     Madrid       1 
2020-01-20        Madrid    London       1 

Result = 1 (home команда выиграла)

Результат = 0 (команда посетителя выиграла)

с df.set_index('date')[['home', 'result']].groupby(['home', 'date'])['result'].sum() я получил следующий результат:

                        0  1
home      date
Lisbon    2020-01-13    0  1
          2020-01-16    1  0
London    2020-01-03    0  1
Madrid    2020-01-03    1  0
          2020-01-20    0  1
Paris     2020-01-01    0  1
          2020-01-18    0  1

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

                        0  1
home      date
Lisbon    2020-01-13    0  0
          2020-01-16    0  1
London    2020-01-03    0  0
Madrid    2020-01-03    0  0
          2020-01-20    1  0
Paris     2020-01-01    0  0
          2020-01-18    0  1

Я пытался с Rolling (), но я не знаю, как сбросить каждый ролл home index

Есть идеи?

С уважением

Ответы [ 2 ]

0 голосов
/ 07 марта 2020

Я мог сделать это только путем дублирования всех строк, чтобы получить столбец с указанием результатов для команд в столбце Home. Как только это будет сделано, cumsum выполнит свою работу, и тогда нам просто понадобятся операции представления для получения ожидаемого результата:

# repeat all lines to build a column away showing for a team its away victories
df2 = pd.concat([df, df[['date', 'Visitors']]
                 .rename(columns = {'Visitors': 'Home'})
                 .assign(away=1-df['Result'])],
                sort=False)

# sum the home and away victories
# and remove the current result from the sum of home victories to only
# keep previous ones
df3 = pd.concat([df2[['date', 'Home', 'Result']], df2.groupby('Home')
                 [['Result', 'away']].cumsum().rename(
                     columns={'Result': 'tot_home'})], axis=1, sort=False
                ).sort_values('date').reset_index(drop=True)

df3['tot_home'] -= df3['Result']

# forward fill by team to "merge" the home and away match results
df4 = df3.groupby('Home').apply(lambda x: x.ffill()).fillna(0).set_index(
    ['Home', 'date']).sort_index().drop(columns='Result')

# finaly get the expected result
df5 = df4.loc[df.set_index(['Home', 'date']).index].sort_index()

Это дает:

                   tot_home  away
Home   date                      
Lisbon 2020-01-13       0.0   0.0
       2020-01-16       1.0   0.0
London 2020-01-14       0.0   1.0
Madrid 2020-01-03       0.0   0.0
       2020-01-20       0.0   0.0
Paris  2020-01-01       0.0   0.0
       2020-01-18       1.0   0.0

Примечания:

  • Я использовал разные имена фреймов данных (df2-df5), чтобы увидеть все промежуточные результаты. Можно было бы использовать только один df2.
  • У меня не совсем то, что указано в вопросе, но я думаю, что мои значения правильные.
0 голосов
/ 06 марта 2020

Я думаю, что вы должны реструктурировать свой DF, включить колонку для команд, и вместо того, чтобы указывать названия команд дома / в гостях, ставить оценки там.

Таким образом, вы сможете группировать по командам и сможет суммировать как домашние, так и выездные цели по отдельности с (относительно) новым namedAgg

Если вы реструктурируете свой DF примерно так:

DATE     | TEAM     | HOME VICTORY | AWAY VICTORY
01-01-20   ATLETICO        1              0
01-01-20   DORTMUND        0              0
01-02-20   PSG             0              1
01-02-20   PORTO           0              0 
01-10-20   ATLETICO        0              1
01-10-20   PSG             0              1

И предположим, что первые 2 матча - Атл против Дора, Атл ​​выигрывает дома, затем другие матчи - ПСЖ против Пор, ПСЖ выигрывает, а третий - Атл против ПС, Атл ​​выигрывает.

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

Группируйте его по команде и дате:

TEAM     | DATE     | HOME VICTORY | AWAY VICTORY
ATLETICO   01-01-20        1              0
ATLETICO   01-10-20        0              1
PSG        01-02-20        0              1
PSG        01-10-20        0              0

Или сгруппируйте его по командам, чтобы увидеть все их выступления

 TEAM     | HOME VICTORY | AWAY VICTORY
ATLETICO          1              1
PSG               0              1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...