Заполняйте значения NA упорядоченным образом в зависимости от условия

#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 вызывает некоторую ошибку, поэтому я пропустил это, и из двух первый сработал замечательно. Спасибо за код