У меня есть пандас 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)
- Арсенал был хозяевами поля.
- Арсенал был в гостях.
А также.В скольких матчах участвовал «Арсенал», «Хозяева» и «Гости», в которых они И / ИЛИ команда соперников НЕ забивали гол?(BTS = N)
И мы хотим получить одинаковое резюме для каждой из 20 команд.
Обратите внимание, я не думаю, что в этом расчете нужны булевы условия, как в BTSзначение Y или N для каждого совпадения уже получено в исходном наборе данных.Я просто хочу сгруппировать количество Y и N для каждой команды, дома и в гостях.
Кто-нибудь знает, есть ли более быстрый способ получить это резюме, чем пройти все шаги выше?