#python #pandas #dataframe
#python #pandas #фрейм данных
Вопрос:
Итак, у меня есть все точки данных, отформатированные в таблицу, где теперь я могу начать обобщать свои выводы.
home_goals away_goals result home_points away_points
2006-2007 1 1 D 1 1
2006-2007 1 1 D 1 1
2006-2007 2 1 H 3 0
2006-2007 2 1 H 3 0
2006-2007 3 0 H 3 0
... ... ... ... ... ... ... ...
2019 - 2020 0 2 A 0 3
2019 - 2020 5 0 H 3 0
2019 - 2020 1 3 A 0 3
2019 - 2020 3 1 H 3 0
2019 - 2020 1 1 D 1 1
Моя цель — собрать это в новый фрейм данных, который суммирует каждый сезон в следующих столбцах:
Season_breakdown = pd.DataFrame(columns = ['Season','Matches Played','Home
Wins','Draws','Away Wins', 'Home Points',
'Away Points'])
Мое текущее решение — запустить что-то вроде этого
index_count = pd.Index(data_master.index).value_counts()
index_count
Это выводит:
2007-2008 380
2013-2014 380
2010-2011 380
2017-2018 380
2015-2016 380
2016-2017 380
2009-2010 380
2014-2015 380
2012-2013 380
2006-2007 380
2018-2019 380
2011-2012 380
2008-2009 380
2019 - 2020 P1 288
2019 - 2020 P2 92
а затем жестко запрограммируйте результаты в новую переменную данных, которую я могу включить в свой Season_breakdown, и повторите аналогичные шаги, чтобы сопоставить информацию о победах хозяев (по сезонам) победах гостей (по сезонам) очках хозяев (по сезонам) очках гостей (по сезонам) очках гостей (по сезонам). по сезонам).
Цель состоит в том, чтобы иметь что-то вроде;
Season MatchesPlayed HomeWins Draws AwayWins HomePoints AwayPoints
2006-2007 380 (sum H 6/7) (sum D 6/7) (sum H 6/7) (sum h_points)(sum a_points)
2007-2008 380 (sum H 7/8) (sum D 7/8) (sum H 7/8) (sum h_points)(sum a_points)
2008-2009 380 (sum H 8/9) (sum D 8/9) (sum H 8/9) (sum h_points)(sum a_points)
2009-20010 380 (sum H 9/10)(sum D 9/10)(sum H 9/10)(sum h_points)(sum a_points)
И т.д.
Я чувствую, что есть гораздо более надежный способ приблизиться к этому, и надеялся на некоторое понимание.
Спасибо
Комментарии:
1. Я не думаю, что вам нужен промежуточный фрейм данных для подсчета. Просто используйте
pandas.pivot_table
, и вы можете использоватьaggfunc
параметр для подсчета одних значений и суммирования других.2. Спасибо за понимание, Эрик, просто чтобы уточнить, я бы использовал pandas.pivot_table, а затем скорректировал бы каждое из условий или я мог бы записать все условия в одной таблице?
Ответ №1:
У вас есть многоуровневые агрегации. Очки суммируются на уровне сезона, в то время как победы / ничьи суммируются на комбинированном уровне сезона / результата. Итак, одним из вариантов является объединение результата в несколько этапов, а затем объединение / объединение результатов:
season_points = df.groupby(level=[0]).agg({'home_points': 'sum', 'away_points': 'sum'})
season_count = df.groupby(level=[0]).result.count().rename('MatchesPlayed').to_frame()
season_results = pd.crosstab(df.index, df.result).rename(
columns={'A': 'AwayWins', 'D': 'Draws', 'H': 'HomeWins'})
season_results.index.name = None
agg_df = pd.concat([season_count, season_results, season_points], axis=1)
.rename(columns={'home_points': 'HomePoints', 'away_points': 'AwayPoints'})
print(agg_df)
# MatchesPlayed AwayWins Draws HomeWins HomePoints AwayPoints
#2006-2007 5 0 2 3 11 2
#2019 - 2020 5 2 1 2 7 7