我正在尝试使用以下数据计算每月的客户流失率。然而,不幸的是,我没有一个布尔值,当客户搅动或不搅动时,它的值为1/True或0/False。您可以假设,当客户在某一个月下订单时,他/她没有流失,当他/她在那个月没有下订单时,他/她就流失了。我明白这会导致流失率的波动,但现在这无关紧要。
项th>2017-11-07 19:06:43 面包、牛奶 2017-11-07 20:06:43 2017-12-07 21:06:43 键盘,豆浆派
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