【问题标题】:Pandas groupby and rank - same rank for duplicates熊猫 groupby 和排名 - 重复的排名相同
【发布时间】:2019-03-15 13:24:23
【问题描述】:

这是我的数据框:

my_df = pd.DataFrame({'group':['a','a', 'a','b','b'], 'date':['2017-01-02', '2017-01-02','2017-03-01',  '2018-02-05', '2018-04-06']})
my_df['date']= pd.to_datetime(my_df['date'], format = '%Y-%m-%d')

我想为每个组添加排名,其中相同的值将被分配相同的排名。

这是我想要的输出:

    date        group rank
0   2017-01-02      a 1
1   2017-01-02      a 1
2   2017-03-01      a 2
3   2018-02-05      b 1
4   2018-04-06      b 2

我想我可以通过分组两次并排名并加入原始数据框来做到这一点,但我想知道是否有更快的方法来做到这一点。

【问题讨论】:

    标签: pandas unique pandas-groupby rank


    【解决方案1】:

    只需使用 rank 和方法 dense

    my_df.groupby(['group'])['date'].rank(method ='dense')
    Out[6]: 
    0    1.0
    1    1.0
    2    2.0
    3    1.0
    4    2.0
    Name: date, dtype: float64
    

    【讨论】:

    • 我在文档中看到了这个选项,但没能正确理解
    【解决方案2】:

    您可以将transform 与因式分解一起使用:

    my_df['group_rank'] = my_df.groupby(['group'])['date'].transform(lambda x: x.factorize()[0])
    
    >>> my_df
            date group  group_rank
    0 2017-01-02     a           0
    1 2017-01-02     a           0
    2 2017-03-01     a           1
    3 2018-02-05     b           0
    4 2018-04-06     b           1
    

    如果您在末尾添加+ 1,它将是您想要的输出中的 1 和 2 等级,但我认为这可能并不重要(因为它们在任何情况下都被正确地组合在一起)

    【讨论】:

    • 我希望我能接受这两个答案。您的方法更加通用,不需要记住 rank 函数的选项
    • 谢谢,我认为@Wen 的排名方法最终会更快。
    猜你喜欢
    • 1970-01-01
    • 2016-11-19
    • 2017-06-17
    • 2019-04-07
    • 1970-01-01
    • 1970-01-01
    • 2019-08-03
    • 1970-01-01
    • 2019-03-19
    相关资源
    最近更新 更多