Python 熊猫数据帧:如何在groupby上分组?
我试图概括我所问的问题Python 熊猫数据帧:如何在groupby上分组?,python,pandas,dataframe,Python,Pandas,Dataframe,我试图概括我所问的问题 mlb数据帧看起来像 Player Position Salary Year 0 Mike Witt Pitcher 1400000 1988 1 George Hendrick Outfielder 989333 1988 2 Chili Davis Outfielder 950000 1988
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”)
我就很难做下一步了。我认为一个嵌套的groupby播放器是必要的,但我不知道如何进行。这很混乱,但可以完成任务
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')
或
正如@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
试试这个
import numpy as np
g = df.groupby(['Position', 'Player']).aggregate({'Salary': sum, 'Player': lambda y: np.unique(y)})
print g.max(level=['Position'])
这并没有考虑到同一个玩家可能在不同年份多次上市的事实。我想要的是他们的总收入,而不是一年内的最高工资。这似乎是可行的,但似乎很混乱。我想知道是否有更干净的方法。我只是想把这当作一个练习,因为这似乎是一个经常出现的问题。如果没有一个更干净的解决方案使用
aggregate
或其他东西,我会感到惊讶。如果它在两个不同的年份名称相同但位置不同呢?我不担心这一点。处于两个位置的同一名球员只能代表两名不同的球员。请提供测试数据,测试您尝试做的所有事情——可能是所有投手,但不同年份的不同收入有不同的总和。这似乎是将球员姓名串联在一起,因为聚合({'Salary':sum,'player':sum})。但是如果我删除了“球员”:sum
,那么球员的名字就丢失了。编辑了答案,但没有那么干净。工资总额看起来是正确的,但我不认为它产生了正确的球员名字。弗兰克·史密斯真的毁了一切
import numpy as np
g = df.groupby(['Position', 'Player']).aggregate({'Salary': sum, 'Player': lambda y: np.unique(y)})
print g.max(level=['Position'])