发布于2026-07-02 阅读(0)
扫一扫,手机访问
在客户行为分析中,识别“连续访问”是评估用户活跃度的关键指标之一。给定一个包含 id(客户ID)和 visit_date(访问日期)的 DataFrame,目标是:对每个客户,找出所有连续访问区间各自的天数,并返回其中的最大值(例如客户1有 [1/2, 1/3, 1/4] 和 [1/7–1/10] 两段,对应长度 3 和 4,最终结果为 4)。
核心思路其实挺直观的:把日期序列转成时间差序列,找到那些“断点”——也就是间隔超过1天的位置,然后根据断点生成连续区间,数一数每个区间有多长,最后挑出最长的那个。怎么做到呢?Pandas的向量化操作可以一步到位,既快又简洁。
import pandas as pd
import numpy as np
# 示例数据(注意:原始日期格式需能被正确解析)
df = pd.DataFrame({
'id': [1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,3,3,3,4,4,4],
'visit_date': [
'1/2/2022','1/3/2022','1/4/2022','1/7/2022','1/8/2022',
'1/9/2022','1/10/2022','1/1/2022','1/2/2022','1/4/2022',
'1/6/2022','1/7/2022','1/8/2022','1/9/2022','1/10/2022',
'1/3/2022','1/4/2022','1/5/2022','1/3/2022','1/4/2022','1/8/2022'
]
})
# 步骤详解(推荐用于理解逻辑)
df['visit_date'] = pd.to_datetime(df['visit_date'], format='%m/%d/%Y') # 统一转为 datetime
df = df.sort_values(['id', 'visit_date']).reset_index(drop=True) # 必须排序!
# 构建连续组标识:当与前一行日期差 ≠ 1 天时,开启新组
df['date_diff'] = df.groupby('id')['visit_date'].diff().dt.days
df['group_id'] = df.groupby('id')['date_diff'].apply(lambda x: (x != 1).cumsum())
# 每组内计数 → 得到各连续段长度
consecutive_lengths = df.groupby(['id', 'group_id']).size().reset_index(name='length')
# 对每个客户取最大连续长度(排除单日孤立访问可选:length > 1)
result = consecutive_lengths.groupby('id')['length'].max().reset_index(name='consecutive_days')
print(result)
输出:
id consecutive_days 0 1 4 1 2 5 2 3 3 3 4 2
有几个关键点需要注意:
这个方法的通用性很强,电商的复购分析、SaaS 的用户登录追踪、医疗的随访记录,基本都能直接套用。
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8