首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >熊猫数据群中行排序的快速方法

熊猫数据群中行排序的快速方法
EN

Stack Overflow用户
提问于 2014-11-03 18:47:25
回答 2查看 60.6K关注 0票数 32

我有一个熊猫数据框架,它由不同的子组组成。

代码语言:javascript
复制
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,ID2的秩为4,在B组中,Id 5的秩为2,ID8的秩为1,依此类推。

现在,我根据以下几个方面来评估职级:

  1. 按价值分类。

代码语言:javascript
复制
df.sort('value', ascending = True, inplace=True)
  1. 创建一个ranker函数(它假定变量已经排序)

代码语言:javascript
复制
def ranker(df):
    df['rank'] = np.arange(len(df)) + 1
    return df
  1. 分别对每一组应用ranker函数:

代码语言:javascript
复制
df = df.groupby(['group']).apply(ranker)

这个过程可以工作,但是当我在数以百万行的数据上运行它时,它是非常慢的。有没有人想过如何做一个更快的牧羊人功能。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-11-03 19:13:58

等级化了,所以应该非常快。您可以传递与df.rank() hererank的文档相同的选项。正如您所看到的,可以通过method参数以五种不同的方式中的一种来实现领带中断。

您也可能只想要这个组的.cumcount()

代码语言:javascript
复制
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
票数 52
EN

Stack Overflow用户

发布于 2016-04-29 13:30:22

使用一个大的DataFrame (1300万行),这个方法和groupby一起使用了我的8GB内存,而且花费了很长的时间。我在记忆中找到了一个不那么贪婪的解决办法,我把它放在这里,以防万一:

代码语言:javascript
复制
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
票数 15
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26720916

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档