2015-03-31 2 views
1

Я пытаюсь обобщить вопрос, который я задал here.Pandas Dataframes: Как сгруппировать по группе?

mlb dataframe выглядит

Player    Position   Salary  Year 
0 Mike Witt   Pitcher   1400000 1988 
1 George Hendrick Outfielder  989333  1988 
2 Chili Davis  Outfielder  950000  1988 
3 Brian Downing  Designated Hitter 900000  1988 
4 Bob Boone   Catcher   883000  1988 
5 Bob Boone   Catcher   883000  1989 
6 Frank Smith  Catcher   993000  1988 
7 Frank Smith  Pitcher   1300000 1989 

Обратите внимание, что тот же игрок может быть указан несколько раз для разных лет. Я пытаюсь найти игрока с максимальной суммой зарплаты для каждой позиции. Выход должен быть что-то вроде:

Position   Player   Salary  
0 Pitcher   Mike Witt   1400000 
1 Outfielder   George Hendrick 989333 
2 Brian Downing  Designated Hitter 900000 
3 Catcher   Bob Boone   1766000 

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

Как только я сделаю positions = mlb.groupby("Position") У меня возникли проблемы с следующим шагом. Я думаю, что вложенная группа от игрока необходима, но я не знаю, как действовать.

+0

Что делать, если это одно и то же имя, но различное положение в двух разных лет? – dawg

+0

Я не собираюсь беспокоиться об этом. Тот же игрок на двух позициях может представлять только двух разных игроков. – theQman

+0

Вставьте тестовые данные, которые выполняют все, что вы пытаетесь сделать - возможно, все кувшины, но разные доходы в разные годы с разными суммами. – cphlewis

ответ

2

Это грязно, но выполняет свою работу.

df = pd.DataFrame({'Player':['Mike Witt','George Hendrick','Chili Davis','Brian Downing','Bob Boone','Bob Boone'], 
       'Position':['Pitcher','Outfielder','Outfielder','Designated Hitter','Catcher','Catcher'], 
       'Salary':[1400000,989333, 950000,900000,883000,900000], 
       'Year':[1988,1988,1988,1988,1988,1988]}) 

gp = df.groupby(['Player','Position']).sum()['Salary'].to_frame().reset_index() 
gp.sort('Salary',ascending=False).drop_duplicates('Position') 

ИЛИ

gp.groupby('Position').max() 

Как @dawg упоминалось, это будет по существу лечить игрока, который имеет несколько позиций, как различные игроки, так что их зарплаты на позиции то, что показано здесь.

  Player   Position Salary 
0  Bob Boone   Catcher 1783000 
4  Mike Witt   Pitcher 1400000 
3 George Hendrick   Outfielder 989333 
1 Brian Downing Designated Hitter 900000 
+0

Это не учитывает тот факт, что один и тот же игрок может быть указан несколько раз за разные годы. Я хочу их общий заработок, а не максимальную зарплату за один год. – theQman

+0

Кажется, что это работает, но он * делает * кажется грязным. Мне интересно, есть ли более чистый способ. Я только пытаюсь сделать это как упражнение, поскольку это похоже на проблему, которая часто возникает. Я был бы удивлен, если бы не было более чистого решения, использующего 'aggregate' или что-то еще. – theQman

0

Попробуйте

import numpy as np 
g = df.groupby(['Position', 'Player']).aggregate({'Salary': sum, 'Player': lambda y: np.unique(y)}) 
print g.max(level=['Position']) 
+0

Это похоже на объединение имен игроков из-за 'aggregate ({'Salary': sum, 'Player': sum})'. Но если я удалю ''Player': sum', имена Игроков будут потеряны. – theQman

+0

Отредактирован ответ, но не такой чистый. – gstvolvr

+0

На самом деле, теперь проверьте. – gstvolvr

Смежные вопросы