#python #pandas #dataframe #datetime #fillna
Вопрос:
Идентификатор клиента | Buying_Round | Дата | Сумма Покупки_амаунт$ |
---|---|---|---|
1001 | 2 | 01/02/2020 | 20 |
1001 | NaN | 07/03/2020 | 42 |
1001 | NaN | 01/01/2020 | 15 |
1002 | NaN | 01/07/2020 | 10 |
1002 | NaN | 07/04/2020 | 40 |
1002 | NaN | 12/11/2020 | 25 |
1003 | 1 | 22/02/2020 | 30 |
1003 | NaN | 14/03/2020 | 52 |
1003 | NaN | 10/10/2020 | 45 |
Идентификатор клиента-это уникальный номер каждого клиента, основанный на некоторых конфиденциальных данных. Это для продуктового магазина, который пытается понять, как покупатель склонен покупать, основываясь на раунде, в который он входит, и сумме, которую он покупает, чтобы улучшить запасы. Покупка — это уже n-й раз, когда они приходят в магазин.
То, что я сделал, — из этой беспорядочной информации я отсортировал идентификатор клиента, я также могу отсортировать дату, но хотел, чтобы проблема была как можно более оригинальной. После сортировки дат становится очевидным, что дата влияет на раунд покупки, и я намерен сохранить раунд покупки для расчета раунда против покупки. Теперь я хочу заполнить раунд покупки в порядке возрастания от 1 — количество раз, когда появляется уникальный клиент, а затем снова начать с 1 для следующего клиента.
Ожидаемые результаты :
Идентификатор клиента | Buying_Round | Дата | Сумма Покупки_амаунт$ |
---|---|---|---|
1001 | 2 | 01/02/2020 | 20 |
1001 | 3 | 07/03/2020 | 42 |
1001 | 1 | 01/01/2020 | 15 |
1002 | 2 | 01/07/2020 | 10 |
1002 | 1 | 07/04/2020 | 40 |
1002 | 3 | 12/11/2020 | 25 |
1003 | 1 | 22/02/2020 | 30 |
1003 | 2 | 14/03/2020 | 52 |
1003 | 3 | 10/10/2020 | 45 |
Примечание: 1001 находится примера исходные данные имеют 1001 произойти 12 раз 1002 происходит 4 раза и 1003 происходят 15 раз с общим 11000 уникальных клиентов на этот год, без рисунка или с фиксированными значениями, чтобы определить, сколько количество для каждого уникального идентификатора, мы уверены, что имеют value_counts
, но хотят работать с более простым способом, чем другие жесткого кодирования его.
Комментарии:
1. Если у клиента 1001 было две записи на одну и ту же дату, должны ли они быть одним и тем же номером покупки или они должны отличаться?
2. Нет единой записи для одной даты 2 точки данных, потому что данные генерируются в день, поэтому, если он приходит 10 раз, общая сумма добавляется и дается 1 раунд
3. В основном это происходит из-за использования наличных денег для покупки, и кассиру необходимо вводить данные вручную, и, следовательно, многие значения nan, потому что они не заботятся о покупке.
Ответ №1:
Мы можем попробовать groupby rank
после преобразования Date
столбца to_datetime
:
df['Buying_Round'] = (
pd.to_datetime(df['Date'], dayfirst=True)
.groupby(df['CustomerID']).rank(method='dense')
.astype(int)
)
Или с sort_values
и groupby cumcount
:
df['Buying_Round'] = (
pd.to_datetime(df['Date'], dayfirst=True)
.sort_values()
.groupby(df['CustomerID']).cumcount() 1
)
Оба Производят:
CustomerID Buying_Round Date Purchase_amount$
0 1001 2 01/02/2020 20
1 1001 3 07/03/2020 42
2 1001 1 01/01/2020 15
3 1002 2 01/07/2020 10
4 1002 1 07/04/2020 40
5 1002 3 12/11/2020 25
6 1003 1 22/02/2020 30
7 1003 2 14/03/2020 52
8 1003 3 10/10/2020 45
Комментарии:
1. поэтому мне нужно сначала отсортировать даты по возрастанию, верно? для 1-го способа
2. Только со вторым вариантом. No. Ранг будет правильно присваивать значения без сортировки.
3. хорошо, позвольте мне попробовать оба метода и посмотреть, как все пойдет, большое вам спасибо за помощь
4. Обновление: Я попробовал оба метода dayfirst=True вызывает некоторую ошибку, поэтому я пропустил это, и из двух первый сработал замечательно. Спасибо за код