我有一个由不同子组组成的pandas数据框。
df = pd.DataFrame({
'id':[1, 2, 3, 4, 5, 6, 7, 8],
'group':['a', 'a', 'a', 'a', 'b', 'b', 'b', 'b'],
'value':[.01, .4, .2, .3, .11, .21, .4, .01]
})
我想在其组中找到每个id的等级,比如说,值越低越好。在上面的示例中,在组A中,Id 1的排名为1,Id 2的排名为4.在组B中,Id 5的排名为2,Id 8的排名为1,因此上。
现在我通过以下方式评估排名:
按值排序。
df.sort('value', ascending = True, inplace=True)
创建一个排名函数(它假定变量已经排序)
def ranker(df):
df['rank'] = np.arange(len(df)) + 1
return df
分别对每个组应用排名功能:
df = df.groupby(['group']).apply(ranker)
这个过程有效,但是当我在数百万行数据上运行时,它真的很慢。有没有人对如何制作更快的排名功能有任何想法。
答案 0 :(得分:33)
df.rank()
相同的选项
here是rank
的文档。如您所见,可以通过method
参数以五种不同方式之一完成平局中断。
你也可以只想要小组的.cumcount()
。
In [12]: df.groupby('group')['value'].rank(ascending=False)
Out[12]:
0 4
1 1
2 3
3 2
4 3
5 2
6 1
7 4
dtype: float64
答案 1 :(得分:9)
使用一个大的DataFrame(1300万行),使用groupby的方法排名最大化了我的8GB内存并花了很长时间。我在内存中发现了一种不那么贪心的解决方法,我放在这里以防万一:
df.sort_values('value')
tmp = df.groupby('group').size()
rank = tmp.map(range)
rank =[item for sublist in rank for item in sublist]
df['rank'] = rank