【问题标题】:Fill NA values in ordered manner based on condition根据条件以有序方式填充NA值
【发布时间】:2021-10-21 10:48:00
【问题描述】:
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

客户 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,但希望使用一种更简单的方式而不是硬编码。

【问题讨论】:

  • 如果客户 1001 在同一日期有两个条目,它们应该是相同的 Buying_Round 编号还是应该不同?
  • 对于单个日期 2 个数据点没有单个条目,因为数据是每天生成的,所以如果他来 10 次,总金额会被添加并在第 1 轮中给出
  • 这基本上是因为现金用于购买,收银员需要手动输入数据,因此很多值都是 nan,因为他们不关心购买回合

标签: python pandas dataframe datetime fillna


【解决方案1】:

我们可以在转换Dateto_datetime后尝试groupby rank

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

或者用sort_valuesgroupby 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

【讨论】:

  • 所以我需要先按升序对日期进行排序吗?第一种方法
  • 只有第二个选项。不会。Rank 将正确分配值而不进行排序。
  • 好的,我试试这两种方法,看看效果如何,非常感谢您的帮助
  • 更新:我尝试了两种方法 dayfirst=True 都会导致一些错误,所以我跳过了这两种方法,第一种方法效果很好。感谢您的代码
猜你喜欢
  • 2022-08-18
  • 2017-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多