0

我正在尝试使用以下数据每月计算客户流失率。然而,不幸的是,当客户流失或不流失时,我没有一个布尔值,它取值为 1/True 或 0/False。您可以假设当客户在某个月份订购时,他/她没有流失,而当他/她在该月没有订购时,他/她就流失了。我明白这会导致流失率波动,但现在这并不重要。

日期 客户ID 项目
2017-11-07 19:06:43 00001 面包、牛奶
2017-11-07 20:06:43 00002 面团
2017-12-07 21:06:43 00003 苹果
2018-01-07 21:06:43 00002 萝卜
2018-01-07 21:06:43 00001 键盘, 豆浆机
2018-02-07 21:06:43 00003 馅饼
2018-03-07 21:06:43 00002
2018-03-07 21:06:43 00003
2018-04-07 21:06:43 00004 口香糖

我尝试使用按月重新采样它们

    df_monthly = df.resample('M', on='date').count()

随后我有每个月的订单数量,但我不知道谁流失了。我希望有人可以帮助我解决这个问题。

非常感谢 :)

4

1 回答 1

0

IIUC,按月对每一行进行分组并将CustomerID列转换为一组:

out = df.groupby(pd.Grouper(freq='M', key='date'))['CustomerID'].apply(set)
print(out)

# Output
date
2017-11-30    {00002, 00001}
2017-12-31           {00003}
2018-01-31    {00002, 00001}
2018-02-28           {00003}
2018-03-31    {00002, 00003}
2018-04-30           {00004}
Freq: M, Name: CustomerID, dtype: object

现在您必须找到两组之间的差异:

out = out.to_frame().assign(CustomerIDPrev=out.shift(fill_value=set())) \
         .apply(lambda x: x.iloc[1].difference(x.iloc[0]), axis=1).tolist()
print(out)

# Output
date
2017-11-30                {}
2017-12-31    {00002, 00001}
2018-01-31           {00003}
2018-02-28    {00002, 00001}
2018-03-31                {}
2018-04-30    {00002, 00003}
Freq: M, dtype: object
于 2021-09-07T10:12:04.610 回答