在pandas datafram中更快地对子组中的行进行排序的方法

2024-10-03 06:27:35 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个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,依此类推。

现在我通过以下方式来评估等级:

  1. 按值排序。

    df.sort('value', ascending = True, inplace=True)

  2. 创建一个ranker函数(它假设变量已经排序)

    def ranker(df): df['rank'] = np.arange(len(df)) + 1 return df

  3. 分别对每组应用ranker函数:

    df = df.groupby(['group']).apply(ranker)

这个过程可以工作,但当我在数百万行数据上运行它时,它确实很慢。有人对如何使ranker函数更快有什么想法吗。


Tags: 数据函数框架idtruepandasdf排序
2条回答

等级是计算机化的,所以应该非常快。您可以传递与df.rank()相同的选项 hererank的文档。如您所见,tie break可以通过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

在处理一个大数据帧(1300万行)时,groupby的方法排名最大化了我8GB的RAM,这花了很长时间。我在记忆中找到了一个不那么贪婪的解决方法,放在这里以防万一:

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

相关问题 更多 >