Python 按列聚合排序

Python 按列聚合排序,python,pandas,Python,Pandas,我想创建一个列manager\u rank,该列根据回报的sum对经理进行排名。我已经想出了一个解决方案张贴在下面,但希望如果其他人有更优雅的东西 import pandas as pd df = pd.DataFrame([['2012', 'A', 1], ['2012', 'B', 4], ['2011', 'A', 5], ['2011', 'B', 4]], columns=['year', 'manager', 'return']) 预期结果:

我想创建一个列
manager\u rank
,该列根据回报的
sum
对经理进行排名。我已经想出了一个解决方案张贴在下面,但希望如果其他人有更优雅的东西

import pandas as pd
df = pd.DataFrame([['2012', 'A', 1], ['2012', 'B', 4], ['2011', 'A', 5], ['2011', 'B', 4]],
                 columns=['year', 'manager', 'return'])
预期结果:

   year manager  return  manager_rank
0  2012       A       1             2
1  2011       A       5             2
2  2012       B       4             1
3  2011       B       4             1
一艘班轮: 逐步详细信息: 1.按经理分组,使用
sum
作为聚合函数 2.使用
rank()
3.将此结果强制转换到另一列
4.将上述步骤的结果与原始数据帧连接起来!

您可以将
删除到_frame
并将
名称添加到:


如何扩展@Stefan提出的方法,以包括每个经理的最终累积回报(回报不求和,它们是复合的)


这是一个展示累积回报的好方法。我应该把return\u pct列命名为-(。这是对另一个问题的一个很好的回答。
manager_rank = (df.groupby('manager')
                  .sum()
                  ['return']
                  .rank(ascending=False)
                  .to_frame(name='manager_rank')
                  .reset_index()
                )

df = pd.merge(df, manager_rank, on='manager')
In [8]: df.groupby('manager').sum()
Out[8]: 
         return
manager        
A             6
B             8
In [9]: df.groupby('manager').sum().rank()
Out[9]: 
         return
manager        
A             1
B             2

In [10]: df.groupby('manager').sum().rank(ascending=False)
Out[10]: 
         return
manager        
A             2
B             1
In [13]: df.groupby('manager').sum().rank(ascending=False)['return'].to_frame(name='manager_rank')
Out[13]: 
         manager_rank
manager              
A                   2
B                   1
df = pd.merge(df, manager_rank, on='manager')
manager_rank = (df.groupby('manager')
                  .sum()
                  ['return']
                  .rank(ascending=False)
                  .reset_index(name='manager_rank')
                )

df = pd.merge(df, manager_rank, on='manager')
print df

   year manager  return  manager_rank
0  2012       A       1             2
1  2011       A       5             2
2  2012       B       4             1
3  2011       B       4             1
df['ranking'] = df.groupby('manager')['return'].transform(np.sum).rank(ascending=False, method='dense')

   year manager  return  ranking
0  2012       A       1        2
1  2012       B       4        1
2  2011       A       5        2
3  2011       B       4        1
df['total_return'] = (df
                      .groupby('manager')['return']
                      .transform(lambda group: (1 + group / 100.).cumprod().iat[-1])) - 1
df['ranking'] = df.total_return.rank(ascending=False, method='dense')

>>> df
   year manager  return  ranking  total_return
0  2012       A       1        2        0.0605
1  2012       B       4        1        0.0816
2  2011       A       5        2        0.0605
3  2011       B       4        1        0.0816