这是我的数据框:
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
我想我可以通过分组两次并排名并重新加入原始数据框来做到这一点,但是我想知道是否有更快的方法来做到这一点。
答案 0 :(得分:5)
只需将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
答案 1 :(得分: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,如您期望的输出那样,但是我认为这可能并不重要(因为在任何情况下都将它们正确地合并在一起)