Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 熊猫数据帧:如何在groupby上分组?_Python_Pandas_Dataframe - Fatal编程技术网

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'])