Создайте новый Pandas .DataFrame с помощью .groupby (...). Agg (sum), затем восстановите несуммированные столбцы - PullRequest
0 голосов
/ 18 июня 2020

Я начинаю с фреймворка базовых сезонов, раздел которого выглядит примерно так:

                   Name  Season   AB    H  SB  playerid
13047   A.J. Pierzynski    2013  503  137   1       746
6891    A.J. Pierzynski    2006  509  150   1       746
1374          Rod Carew    1977  616  239  23   1001942
1422        Stan Musial    1948  611  230   7   1009405
1507        Todd Helton    2000  580  216   5       432
1508  Nomar Garciaparra    2000  529  197   5       190
1509      Ichiro Suzuki    2004  704  262  36      1101

Из этих сезонов я хочу создать фреймворк карьерной статистики; то есть по одной строке для каждого игрока, которая представляет собой сумму их AB, H, и т.д. c. Этот фреймворк по-прежнему должен включать имена игроков. Playerid в приведенном выше является уникальным ключом для каждого игрока и должен быть либо индексом, либо неизменным значением в столбце после создания фрейма данных статистики карьеры.

Моя гипотетическая отправная точка - df_careers = df_seasons.groupby('playerid').agg(sum), но это не учитывается все нечисловые c данные. С numeric_only = False я могу получить какой-то беспорядок в столбцах имен, например «Ичиро Сузуки Ичиро Сузуки Ичиро Сузуки» из-за конкатенации, но это просто требует большой очистки. Это то, что я хотел бы делать с другими наборами данных, и на самом деле данные, которые у меня есть, больше похожи на 25 столбцов, поэтому я бы предпочел понять специальную процедуру c для получения данных Name обратно или сохранения их из в самом начале, а не писать конкретную функцию c и использовать groupby('playerid').agg(func) (или аналогичный процесс) для ее выполнения, если возможно.

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

Ответы [ 3 ]

0 голосов
/ 18 июня 2020

Если между 'playerid' и 'Name' существует взаимно однозначная связь, как кажется, вы можете просто включить 'Name' в столбцы groupby:

stat_cols = ['AB', 'H', 'SB']
groupby_cols = ['playerid', 'Name']
results = df.groupby(groupby_cols)[stat_cols].sum()

Результаты:

                              AB    H  SB
playerid Name                            
190      Nomar Garciaparra   529  197   5
432      Todd Helton         580  216   5
746      A.J. Pierzynski    1012  287   2
1101     Ichiro Suzuki       704  262  36
1001942  Rod Carew           616  239  23
1009405  Stan Musial         611  230   7

Если вы предпочитаете группировать только по идентификатору игрока и после этого снова добавлять данные «Имя», вы можете вместо этого создать сопоставление «playerId» и «Имя» как словарь и найдите его, используя map:

results = df.groupby('playerid')[stat_cols].sum()
name_map = pd.Series(df.Name.to_numpy(), df.playerid).to_dict()
results['Name'] = results.index.map(name_map)

Результаты:

            AB    H  SB               Name
playerid                                  
190        529  197   5  Nomar Garciaparra
432        580  216   5        Todd Helton
746       1012  287   2    A.J. Pierzynski
1101       704  262  36      Ichiro Suzuki
1001942    616  239  23          Rod Carew
1009405    611  230   7        Stan Musial
0 голосов
/ 31 июля 2020

groupy.agg () может принимать словарь, который отображает имена столбцов в функции. Итак, одно из решений - передать словарь в agg, указав, какие функции применять к каждому столбцу.

Используя приведенный выше образец данных, можно использовать

mapping = { 'AB': sum,'H': sum, 'SB': sum, 'Season': max, 'Name': max }
df_1 = df.groupby('playerid').agg(mapping)

Выбор для использования ' max 'для тех, которые не следует суммировать, является произвольным. Вы можете определить лямбда-функцию, которая будет применяться к столбцу, если вы хотите обрабатывать ее определенным образом. DataFrameGroupBy.agg может работать с любой функцией, которая будет работать с DataFrame.apply.

Чтобы расширить это до более крупных наборов данных, вы можете использовать понимание словаря. Это будет хорошо работать:

dictionary = { x : sum for x in df.columns}
dont_sum = {'Name': max,  'Season': max}
dictionary.update(dont_sum)
df_1 = df.groupby('playerid').agg(dictionary)
0 голосов
/ 18 июня 2020

Вы можете написать собственное условие, как вы хотите включать столбцы без суммирования.

col = df.columns.tolist()
col.remove('playerid')
df.groupby('playerid').agg({i : lambda x: x.iloc[0] if x.dtypes=='object' else x.sum() for i in df.columns})

df:

           Name                 Season  AB   H      SB  playerid
playerid                        
190        Nomar_Garciaparra    2000    529  197    5   190
432        Todd_Helton          2000    580  216    5   432
746        A.J._Pierzynski      4019    1012 287    2   1492
1101       Ichiro_Suzuki        2004    704  262    36  1101
1001942    Rod_Carew            1977    616  239    23  1001942
1009405    Stan_Musial          1948    611  230    7   1009405
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...