Pandas groupby 和 rank - 相同的重复排名

Pandas groupby and rank - same rank for duplicates

这是我的数据框:

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

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

您可以将 transform 与 factorize 一起使用:

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 方法 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