Я пытаюсь создать сводный фрейм данных, используя итоги из другого фрейма данных

#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
 

Рабочий пример