Панды группового и звания - одинаковые звания для дубликатов - PullRequest
0 голосов
/ 10 октября 2018

Вот мой фрейм данных:

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

Я думаю, что я могу сделать это, сгруппировавшись дважды, ранжировать и вернуться к исходному фрейму данных, но мне интересно, есть ли более быстрый способсделать это.

Ответы [ 2 ]

0 голосов
/ 10 октября 2018

Просто используя 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
0 голосов
/ 10 октября 2018

Вы можете использовать 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, как в вашем желаемом выводе, но я подумалэто может быть не важно (поскольку они в любом случае правильно объединены)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...