看过来
《pandas 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
在电商或者内容型网络服务中,经常会考察用户的留存指标,运营人员希望产品有较高有粘性,用户可以连续使用产品。本案例将介绍如果用 Python 识别一个连续留存的数据。
源数据如下:
import pandas as pd
df = pd.DataFrame({
'name': list('AAAABBACC'),
'date': ['2021-1-1', '2021-1-2', '2021-1-3',
'2021-1-4', '2021-3-5', '2021-3-21',
'2021-2-22', '2021-3-8', '2021-3-9', ]
})
df
'''
name date
0 A 2021-1-1
1 A 2021-1-2
2 A 2021-1-3
3 A 2021-1-4
4 B 2021-3-5
5 B 2021-3-21
6 A 2021-2-22
7 C 2021-3-8
8 C 2021-3-9
'''
将以上数据进行分析,name 为用户名,date 为登录日期,如果用户的所有登录日期是连续的则认为用户到访一次,记为 1,如果日期不连续则认为到访为多次,记为 2。
如,A用户从1月1日到1月四日有连续登录,但 2 月仍然有非连续的登录,多次登录此时就需要记为 2,用户 C 则仅连续 8 日和 9 日连续登录则记为 1。
首先需要将数据转为时间格式,方便进行时序数据处理。接下来,将数据排序,先按用户再按时间,这样方便我们做后续的处理。
对数据按用户分组,分组后每组(每个用户)中将包含 date 数列,对数据用 diff 求前后的时间差,转为天数,为了方便将没有目标天数产生的 nan 填充为 1。得到的相关天数数列如果所有值为 1 则认为是完全连续的,否则不连续。
将最终得到的每个用户的 True 和 False 值,映射为需求中需要的值。
根据以上思路,最终的实现代码如下:
(
df.astype({'date': 'datetime64[ns]'}) # 将数据转为时间类型
.sort_values(['name', 'date']) # 排序,用户第一序,时间第二序
.groupby('name') # 按用户分组
# 对组内(每个用户)的时间做差,如果全为1说明连续
.apply(lambda x: (x.date.diff(1).dt.days.fillna(1)==1).all())
.map({True: 1, False: 2}) # 枚举映射为 1 和 2
)
'''
name
A 2
B 2
C 1
dtype: int64
'''
(完)
更新时间:2022-03-14 14:52:06 标签:pandas python 留存