Создайте столбец, выполнив итерацию в другом столбце

#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. израэль, большое тебе спасибо! Это было идеально 😉