#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