Панды. Как получить количество groupby для уникальных значений в двух столбцах? - PullRequest
0 голосов
/ 05 июля 2019

У меня есть пандас DataFrame, в котором хранятся результаты Английской Премьер-лиги 2018/19.Всего 380 спичек (строк).Последний столбец «BTS» указывает, забили ли обе команды гол в матче.

bts.head()

HomeTeam     AwayTeam      FTHG  FTAG   BTS
Man United   Leicester      2     1     Y
Bournemouth  Cardiff        2     0     N
Fulham       Crystal Palace 0     2     N
Huddersfield Chelsea        0     3     N
Newcastle    Tottenham      1     2     Y

Я хочу составить сводку для каждой команды (20 команд), показывающую итоги BTS N и Y, где они были домашней командой и где они были командой гостей.А также получить общее количество BTS N и Y для каждой команды.

Резюме, которое я ищу для каждой команды за сезон, выглядело бы следующим образом.

Team           BTS        Home      Away     Total
Arsenal        N          8         4        12
               Y          11        15       26
Bournemouth    N          9         12       21
               Y          10         7       17    

Я пробовал различные способы сгруппировать эти данные, и если я сгруппирую как по «HomeTeam», так и «AwayTeam», этот подход не будет работать.Мне удалось получить какой-то желаемый результат, создав два отдельных фрейма данных для «HomeTeam» и «AwayTeam», затем объединив их в новый фрейм и переименовав столбцы.Хотя этот подход кажется очень трудоемким.Может кто-нибудь, пожалуйста, посоветуйте, как сделать это с меньшим количеством шагов.

Как объединить эти два значения, чтобы получить результат для столбца, озаглавленного «Команда»?

FTHG и FTAG относятся к очным домашним целям и очным целям в матче в матче.,Их значения здесь не нужно включать в какие-либо сводные расчеты, поскольку значение BTS (да или нет) выводится из них в исходном кадре данных.Что я хочу, так это суммарный подсчет BTS Y или N для каждой уникальной команды, когда они были «HomeTeam» и когда они были «AwayTeam», а также Total Y и N для каждой команды.

Мне удалось получить желаемый результат с помощью следующего, но этот подход кажется очень многословным.

bts_home = bts.groupby(['HomeTeam','BTS'])['BTS'].count()
bts_home = bts.groupby(['HomeTeam','BTS'])['BTS'].count()

Это дает две серии.Заголовок которого выглядит следующим образом:

bts_home

HomeTeam        BTS
Arsenal         N       8
                Y      11
Bournemouth     N       9
                Y      10

bts_away

AwayTeam        BTS
Arsenal         N       4
                Y      15
Bournemouth     N      12
                Y       7

Затем я преобразую их в кадры данных с помощью:

df1 = pd.DataFrame(bts_home)
df2 = pd.DataFrame(bts_away)

Эти кадры данных теперь мультииндексированы с именами:

df1 -  ['HomeTeam','BTS']
df2 -  ['AwayTeam','BTS']

Затем я переименовал столбцы в каждом DataFrame, которые содержат счетчики BTS:

df1.columns = ['BTS_Home']
df2.columns = ['BTS_Away']

Затем объединил два DataFrames:

df3 = pd.concat([df1, df2], axis = 1) 

Затем получил общее значение 'BTS' вдругой новый DataFrame:

df4 = df3.assign(Total = df3['BTS_Home'] + df3['BTS_Away'])

Затем переименуйте Уровень 0 мультииндекса:

df4.index.set_names('Team', level = 0, inplace = True)

, что дает:

df4

                      BTS_Home  BTS_Away    Total
Team             BTS            
Arsenal           N          8         4       12
                  Y         11        15       26
Bournemouth       N          9        12       21
                  Y         10         7       17
......
Wolves            N         11         8       19
                  Y          8        11       19

Это в конечном итоге приводит кжелаемое резюме.Но здесь много споров.Я мог бы, вероятно, добиться того же с циклом For с различными условиями If и повторить все результаты и значения BTS для каждой команды, хотя, опять же, это также длинный и неэффективный способ добиться этого.

Многое сделано из эффективности панд, поэтому я хотел бы знать, есть ли более быстрый и эффективный способ добиться этой группировки и подсчета итогов для значений BTS для каждой команды из исходного DataFrame.

Просто повторить.Счет BTS - «Счет обеих команд».Примерное резюме может быть следующим:

За сезон 2018/19 г., в каких матчах участвовал «Арсенал», когда ОБА они и команда соперника забили гол?(BTS = Y)

  1. Арсенал был хозяевами поля.
  2. Арсенал был в гостях.

А также.В скольких матчах участвовал «Арсенал», «Хозяева» и «Гости», в которых они И / ИЛИ команда соперников НЕ забивали гол?(BTS = N)

И мы хотим получить одинаковое резюме для каждой из 20 команд.

Обратите внимание, я не думаю, что в этом расчете нужны булевы условия, как в BTSзначение Y или N для каждого совпадения уже получено в исходном наборе данных.Я просто хочу сгруппировать количество Y и N для каждой команды, дома и в гостях.

Кто-нибудь знает, есть ли более быстрый способ получить это резюме, чем пройти все шаги выше?

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