Лучший подход к поиску последней транзакции клиента?

#python #pandas

#python #pandas

Вопрос:

Я хочу создать новый столбец в моем фрейме данных pandas, который идентифицирует последний раз, когда клиент что-то покупал. Изначально я думал об использовании оператора groupby и min, но проблема с этим подходом заключается в том, что если клиент совершает повторную покупку, он всегда будет показывать только первую транзакцию.

df['earlier_sale'] = df.groupby('Customer_Id')['Sale_Date'].transform('min')

Я думал о создании вложенного цикла for, который оценивает каждую строку, но я не могу понять это или найти какие-либо примеры в Интернете, которые я мог бы использовать в качестве руководства.

 for value in df["Customer_Id"]: 
    for second_value in df["Customer_Id"]:
    
df["Earlier_transaction"] = Earlier_Transaction
 

Ввод:

Дата продажи Customer_Id Сумма
2008-01-01 001 10
2008-01-02 002 10
2008-01-02 001 12
2008-01-03 001 14
2008-01-03 003 50

Желаемый результат:

Входной файл:

Дата продажи Customer_Id Сумма Более ранняя транзакция
2008-01-01 001 10
2008-01-02 002 10
2008-01-02 001 12 2008-01-01
2008-01-03 001 14 2008-01-02
2008-01-03 003 50

Буду признателен за любую помощь или указание правильного направления. Я пытался искать различные подходы, но мне не очень повезло.

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

1. Что такое dtype столбец Sale_Date of? Столбец Sale_Date уже отсортирован?

2. Я использовал pandas datetime для этого столбца, и да, он уже будет отсортирован.

3. Попробуйте shift df['Earlier Transaction'] = df.groupby('Customer_Id')['Sale_Date'].shift()

4. Спасибо! Я посмотрю, что делает shift. ценю это.

Ответ №1:

Вы почти на месте: используйте groupby и найдите max дату в каждой группе. Если у вас возникли проблемы с распознаванием формата даты, преобразуйте ваши даты в datetime , который является правильно упорядоченным типом данных.

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

1. Спасибо! Если я использую groupby и max, не найдет ли он только одну связанную транзакцию для каждого клиента? Извините, если я просто не понимаю.

2. Вы спрашивали в последний раз; это то, что max("Sale_Date") вам даст.

3. @Prune Ваше мышление почти правильное, но max всегда будет давать максимальное значение для каждой группы, и я предполагаю, что OP хочет значение последней транзакции date..by то, как я не тот, кто проголосовал против imgur.com/a/F6WBKum

4. Понятно — но в этом случае OP необходимо изменить вопрос, чтобы указать фактический желаемый результат.

5. @Prune Да. Согласен!

Ответ №2:

 >>> df
   Sale_Date Customer_Id  Amount
0 2021-02-15         001      13
1 2021-02-15         002      13
2 2021-02-16         001      11
3 2021-02-16         002      17
4 2021-02-17         001      14
5 2021-02-17         002      18
6 2021-02-18         001      10
7 2021-02-18         002      16
8 2021-02-19         001      11

>>> df["Earlier Transaction"] = df.groupby("Customer_Id")["Sale_Date"].shift(1)
>>> df
   Sale_Date Customer_Id  Amount Earlier Transaction
0 2021-02-15         001      13                 NaT
1 2021-02-15         002      13                 NaT
2 2021-02-16         001      11          2021-02-15
3 2021-02-16         002      17          2021-02-15
4 2021-02-17         001      14          2021-02-16
5 2021-02-17         002      18          2021-02-16
6 2021-02-18         001      10          2021-02-17
7 2021-02-18         002      16          2021-02-17
8 2021-02-19         001      11          2021-02-18