Python 在数据帧中对子组中的行进行排序的更快方法

Python 在数据帧中对子组中的行进行排序的更快方法,python,pandas,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。在

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

    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',升序=True,原地=True)

  • 创建ranker函数(假定变量已排序)

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

  • 分别在每个组上应用ranker函数:

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


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

    等级是循环化的,所以应该非常快。您可以传递与
    df.rank()相同的选项
    是
    rank
    的文档。正如您所看到的,可以通过
    方法
    参数以五种不同的方式之一完成平局

    您也可能只需要组的
    .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的rank方法使我的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
    

    当然它有一个功能!这就是说,它与上面的函数做的事情并不完全相同,因为如果有一个绑定值,我的函数将随机给一个id一个比另一个具有相同值的id更高的等级。尽管.rank()处理相同值的方法相当合理,但出于我的目的,我需要函数生成的输出。谢谢你的帮助!