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