#pandas #loops #date
Вопрос:
У меня есть два столбца, один с идентификатором, а другой с датами транзакций.
ID | Дата |
---|---|
A | 2019-04-30 |
A | 2020-12-15 |
B | 2019-08-24 |
B | 2019-09-29 |
B | 2019-10-14 |
И так далее…
Я хочу создать столбец, который упорядочивает дату по идентификатору.
ID | Дата | Тип |
---|---|---|
A | 2019-04-30 | Order_1 |
A | 2020-12-15 | Order_2 |
B | 2019-08-24 | Order_1 |
B | 2019-09-29 | Order_2 |
B | 2019-10-14 | Order_3 |
Спасибо!
Ответ №1:
Используйте GroupBy.cumcount
для счетчика с добавлением 1
с приведением к строкам, чтобы можно было добавить Order_
:
df['Type'] = 'Order_' df.groupby('ID').cumcount().add(1).astype(str)
df['diff'] = df.groupby('ID')['Date'].diff().dt.days
У меня возникла проблема, когда я поворачиваю таблицу, мы упорядочиваем дату в алфавитном порядке (Order_1, Order_10, Order_100, ..), а не Order_1, Order_2. Потому что это строка. Есть ли способ обойти это?
Преобразуйте значения в числовые и после поворота используйте DataFrame.add_prefix
:
df['Type'] = df.groupby('ID').cumcount().add(1)
df1 = df.pivot('ID','Type','diff').add_prefix('Order_')
Комментарии:
1. Легенда! Сработало отлично. Если я помещу эту новую таблицу в сводную, как мне вычислить разницу между датами?
2. У меня возникла проблема, когда я поворачиваю таблицу, мы упорядочиваем дату в алфавитном порядке (Order_1, Order_10, Order_100, ..), а не Order_1, Order_2. Потому что это строка. Есть ли способ обойти это?
3. @FilipeCarvalho — Дай мне секунду.
4. Я думаю, я понял, просто вырежьте ‘Order_’ из имени столбца, поскольку это не имеет отношения к проблеме. Тем не менее, хотелось бы помочь рассчитать разницу между датами 🙂
5. израэль, большое тебе спасибо! Это было идеально 😉