Pandas Dataframes:如何在groupby上进行分组?

时间:2015-03-31 22:48:07

标签: python pandas dataframe

我试图概括我问here的问题。

mlb数据框看起来像

    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")后,我无法完成下一步。我认为播放器的嵌套组合是必要的,但我不知道如何继续。

2 个答案:

答案 0 :(得分: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')

OR

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

答案 1 :(得分:0)

试试这个

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