Установите относительное положение в пределах одного уровня индекса фрейма данных pandas

#pandas

Вопрос:

Мне нужно создать новый столбец «событие», содержащий относительное положение строки в группе, после группировки по первому уровню индекса.

Например, если у меня есть следующий фрейм данных:

 df = pd.DataFrame.from_records([
    {'userid': 'test1', 'date': datetime.date(2021, 7, 25), 'value': 100},
    {'userid': 'test1', 'date': datetime.date(2021, 7, 26), 'value': 110},
    {'userid': 'test1', 'date': datetime.date(2021, 7, 27), 'value': 120},
    {'userid': 'test1', 'date': datetime.date(2021, 7, 28), 'value': 130},
    {'userid': 'test2', 'date': datetime.date(2021, 7, 21), 'value': 90},
    {'userid': 'test2', 'date': datetime.date(2021, 7, 24), 'value': 100},
    {'userid': 'test2', 'date': datetime.date(2021, 7, 25), 'value': 110},
], index=['userid', 'date'])
 

введите описание изображения здесь

Я ожидаю получить следующий результат:

с колонкой событий

Прямо сейчас я делаю это:

 for user_id, user_df in df.groupby(level='userid'):
    df.loc[user_id, 'event'] = [x for x in range(len(user_df))]
 

Есть ли лучший (более идиоматичный) способ сделать это?

Комментарии:

1. Было бы действительно полезно, если бы вы опубликовали образец фрейма данных и ваши ожидаемые результаты из него

2. Извините, я отредактировал, чтобы дать более подробную информацию

Ответ №1:

Вы можете использовать groupby() cumcount() :

 df['event']=df.groupby(level=0).cumcount()
 

выход из df :

                    value    event
userid  date        
test1   2021-07-25  100     0
        2021-07-26  110     1
        2021-07-27  120     2
        2021-07-28  130     3
test2   2021-07-21  90      0
        2021-07-24  100     1
        2021-07-25  110     2