在用户行为分析、电商运营等场景中,我们常常需要从存储了用户访问记录的数据集中,提取每个客户的完整访问链,并统计不同访问链的出现频率,以此分析用户的访问偏好和路径特征。本文将以Pandas为核心工具,一步步讲解完整的实现流程。

数据准备与预处理
首先我们需要构造或加载原始的用户访问数据,通常原始数据会包含客户ID、访问的页面标识、访问时间这三个核心字段。如果原始数据中存在缺失值或者时间格式不规范的情况,需要先进行处理。
示例的原始数据格式如下:
import pandas as pd
# 构造示例数据
data = {
'customer_id': ['c001', 'c001', 'c001', 'c002', 'c002', 'c003', 'c003', 'c003', 'c003'],
'page': ['home', 'product', 'cart', 'home', 'search', 'home', 'product', 'product', 'cart'],
'visit_time': [
'2024-05-01 10:00:00', '2024-05-01 10:02:00', '2024-05-01 10:05:00',
'2024-05-01 11:00:00', '2024-05-01 11:03:00',
'2024-05-01 12:00:00', '2024-05-01 12:02:00', '2024-05-01 12:04:00', '2024-05-01 12:06:00'
]
}
df = pd.DataFrame(data)
# 将visit_time转换为datetime类型,方便后续排序
df['visit_time'] = pd.to_datetime(df['visit_time'])
print(df)
按客户分组并排序访问记录
要生成每个客户的访问链,首先需要按照客户ID分组,然后在每个分组内部按照访问时间升序排列,确保访问链的顺序和实际访问顺序一致。
# 按照customer_id分组,组内按照visit_time升序排序 df_sorted = df.sort_values(by=['customer_id', 'visit_time']) print(df_sorted)
生成客户访问链
排序完成后,我们按客户ID分组,将每个客户对应的页面标识拼接成字符串,作为该客户的访问链。这里使用groupby结合agg方法实现,拼接符可以选择箭头、大于号等,方便后续查看。
# 生成访问链,用 -> 作为页面之间的分隔符
customer_chains = df_sorted.groupby('customer_id')['page'].agg(lambda x: ' -> '.join(x)).reset_index()
customer_chains.columns = ['customer_id', 'visit_chain']
print(customer_chains)
统计访问链频率
得到所有客户的访问链之后,我们可以通过统计visit_chain列的取值分布,得到不同访问链的出现频率,还可以按照频率降序排列,快速找到最热门的访问路径。
# 统计访问链频率 chain_freq = customer_chains['visit_chain'].value_counts().reset_index() chain_freq.columns = ['visit_chain', 'frequency'] # 按照频率降序排列 chain_freq = chain_freq.sort_values(by='frequency', ascending=False) print(chain_freq)
完整流程整合
如果需要将整个流程整合为可复用的函数,可以参考以下代码:
def extract_visit_chain_and_freq(df, customer_col='customer_id', page_col='page', time_col='visit_time', sep=' -> '):
"""
从DataFrame中提取客户访问链及其频率
:param df: 原始数据DataFrame
:param customer_col: 客户ID列名
:param page_col: 访问页面列名
:param time_col: 访问时间列名
:param sep: 访问链页面分隔符
:return: 访问链频率统计DataFrame
"""
# 时间格式转换
df[time_col] = pd.to_datetime(df[time_col])
# 排序
df_sorted = df.sort_values(by=[customer_col, time_col])
# 生成访问链
customer_chains = df_sorted.groupby(customer_col)[page_col].agg(lambda x: sep.join(x)).reset_index()
customer_chains.columns = [customer_col, 'visit_chain']
# 统计频率
chain_freq = customer_chains['visit_chain'].value_counts().reset_index()
chain_freq.columns = ['visit_chain', 'frequency']
return chain_freq.sort_values(by='frequency', ascending=False)
# 调用函数测试
result = extract_visit_chain_and_freq(df)
print(result)
注意事项
在实际业务中需要注意几个问题,首先是访问时间的准确性,如果存在同一客户同一时间多次访问的情况,可能需要额外增加排序维度,比如访问记录的ID。其次如果页面标识存在重复值,比如同一个页面连续访问多次是否需要合并,需要根据业务需求调整拼接逻辑,比如可以在拼接前对连续重复的页面去重。最后如果数据量较大,分组操作可以考虑使用sort=False参数提升性能,但需要提前确保数据已经按分组字段排序完成。