看过来
《pandas 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
在电商购物分析中,我们经常要分析用户的留存情况,本例需要根据购物记录标记每个用户购买、复购和流失行为,同样我们来用 pandas 实现。
我们的数据如下:
from io import StringIO
import pandas as pd
data = '''
user_id,2019-10,2019-11,2019-12,2020-01,2020-02
9794320,0,1,0,0,0
10079204,1,1,0,0,0
10280338,1,1,0,1,1
12055855,0,0,1,0,0
12936739,0,0,0,1,0
'''
df = pd.read_csv(StringIO(data), index_col=0)
df
'''
df = pd.read_csv(StringIO(data), index_col=0)
df
'''
2019-10 2019-11 2019-12 2020-01 2020-02
user_id
9794320 0 1 0 0 0
10079204 1 1 0 0 0
10280338 1 1 0 1 1
12055855 0 0 1 0 0
12936739 0 0 0 1 0
'''
一行为一个用户在不同月的购物情况,值为 1 表示用户此月有购物。需求为:
将原数据向右移一位,每个单元格构造一个元组,值为 (上月,本月),然后编写一个函数来对需求中的情况进行判断。
这个函数可以用结构化模式匹配语句(match case)来完成,根据元组的模式来执行相应的填充值。
先将右移的数据与原数据合并:
pd.concat([df.shift(1, axis=1), df])
'''
2019-10 2019-11 2019-12 2020-01 2020-02
user_id
9794320 NaN 0 1 0 0
10079204 NaN 1 1 0 0
10280338 NaN 1 1 0 1
12055855 NaN 0 0 1 0
12936739 NaN 0 0 0 1
9794320 0.0 1 0 0 0
10079204 1.0 1 0 0 0
10280338 1.0 1 0 1 1
12055855 0.0 0 1 0 0
12936739 0.0 0 0 1 0
'''
按用户ID分组,用元组构造方法聚合为一个元组:
(
pd.concat([df.shift(1, axis=1), df])
.groupby(level=0).agg(tuple)
)
'''
2019-10 2019-11 2019-12 2020-01 2020-02
user_id
9794320 (nan, 0.0) (0, 1) (1, 0) (0, 0) (0, 0)
10079204 (nan, 1.0) (1, 1) (1, 0) (0, 0) (0, 0)
10280338 (nan, 1.0) (1, 1) (1, 0) (0, 1) (1, 1)
12055855 (nan, 0.0) (0, 0) (0, 1) (1, 0) (0, 0)
12936739 (nan, 0.0) (0, 0) (0, 0) (0, 1) (1, 0)
'''
这时,可以看到每个单元格已经是上月与下月情况组成的元组了,接下来我们编写判断函数:
def func(some_case: tuple):
match some_case:
case (1, 1):
return '复购'
case (1, 0):
return '流失'
case (_, 1):
return '购买'
case _:
return '-'
这个函数采用了 Python 3.10 的新语法结构化模式匹配来编写,它会判断元组的结构来进行分支运算,当两个值全为 1 是返回「复购」,当分别是 1 和 0 时返回「流失」,除以上情况外当最后一个值是 1 时返回「购买」,以上均不是时返回连字符。
我们将这个函数逐元素应用到数据中:
(
pd.concat([df.shift(1, axis=1), df])
.groupby(level=0).agg(tuple)
.applymap(func) # 应用函数
)
'''
| user_id | 2019-10 | 2019-11 | 2019-12 | 2020-01 | 2020-02 |
|----------:|:----------|:----------|:----------|:----------|:----------|
| 9794320 | - | 购买 | 流失 | - | - |
| 10079204 | 购买 | 复购 | 流失 | - | - |
| 10280338 | 购买 | 复购 | 流失 | 购买 | 复购 |
| 12055855 | - | - | 购买 | 流失 | - |
| 12936739 | - | - | - | 购买 | 流失 |
'''
这样就完成了这个需求。
(完)
更新时间:2024-08-18 16:08:02 标签:pandas python 购物 复购 流失