根据条件以有序方式填充 NA 值

Fill NA values in ordered manner based on condition

CustomerID Buying_Round Date Purchase_amount$
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

Customer Id 是根据某些机密数据为每个客户指定的唯一编号。这是一家杂货店,它试图根据顾客进来的次数和购买量来了解顾客的购买倾向,以改善库存。 购买回合 是他们第 n 次 来店。

我所做的就是在这些混乱的信息中我对客户 ID 进行了排序我也可以对日期进行排序但希望尽可能保持问题的原始性。在对日期进行排序后,很明显日期会影响购买回合,我打算保留购买回合以计算回合与购买。现在我想以递增的顺序填写购买回合,从 1 到唯一客户出现的次数,然后为下一个客户再次从 1 开始。

预期输出:

CustomerID Buying_Round Date Purchase_amount$
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 个唯一客户,没有模式或固定值来确定每个客户的数量唯一 ID,我们确实有 value_counts,但希望使用一种比硬编码更简单的方法。

我们可以试试groupby rank after converting the Date column to_datetime:

df['Buying_Round'] = (
    pd.to_datetime(df['Date'], dayfirst=True)
        .groupby(df['CustomerID']).rank(method='dense')
        .astype(int)
)

sort_values and 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