求Pandas解决方案:计算用户一周内重复浏览元素的占比
计算用户一周内重复浏览元素的占比(Pandas实现)
原始数据
| id | element | dt | | -------- | -------- | -------- | | 1 | a | 22/04/22 | | 2 | a | 22/04/22 | | 1 | b | 27/04/22 | | 1 | a | 23/04/22 | | 3 | b | 22/04/22 | | 1 | a | 22/04/22 | | 1 | a | 22/04/22 | | 3 | b | 23/04/22 | | 3 | b | 25/04/22 | | 1 | a | 27/04/22 | | 1 | c | 26/04/22 | | 1 | d | 26/04/22 | | 1 | g | 25/04/22 | | 1 | b | 27/04/22 |
需求与示例结果
需要计算每个用户(id)一周内重复浏览元素的占比,规则为:
- 同一日期内对同一元素的多次浏览,仅算1次有效访问
- 重复浏览统计:同一用户对同一元素在不同日期的访问次数,全部计入重复次数(如示例中id=1的元素a在3个不同日期访问,即计3次重复)
- 占比公式:重复次数总和 / 该用户的总浏览次数
示例结果:
| id | percentage | | -------- | --------- | | 1 | 0.3 | | 2 | 0.0 | | 3 | 1 |
Pandas实现步骤
1. 导入库并构造数据
import pandas as pd # 构造原始数据表 data = { 'id': [1,2,1,1,3,1,1,3,3,1,1,1,1,1], 'element': ['a','a','b','a','b','a','a','b','b','a','c','d','g','b'], 'dt': ['22/04/22','22/04/22','27/04/22','23/04/22','22/04/22','22/04/22','22/04/22','23/04/22','25/04/22','27/04/22','26/04/22','26/04/22','25/04/22','27/04/22'] } df = pd.DataFrame(data)
2. 数据预处理(日期格式转换)
将dt列转为日期格式,方便后续日期相关的筛选或计算(若需限定一周范围可在此基础上添加筛选逻辑):
df['dt'] = pd.to_datetime(df['dt'], format='%d/%m/%y')
3. 计算总浏览次数
统计每个用户的原始浏览记录总数:
total_views = df.groupby('id').size().reset_index(name='total')
4. 去重处理
去除同一用户-元素-日期的重复记录,保留每日对每个元素的首次访问:
df_unique = df.drop_duplicates(subset=['id', 'element', 'dt'])
5. 统计元素重复访问次数
对去重后的数据,统计每个用户对各元素的跨日期访问次数,并筛选出访问次数>1的元素,求和得到总重复次数:
# 统计每个用户-元素的跨日期访问次数 element_counts = df_unique.groupby(['id', 'element']).size().reset_index(name='unique_count') # 计算每个用户的重复浏览次数总和 repeat_counts = element_counts[element_counts['unique_count'] > 1].groupby('id')['unique_count'].sum().reset_index(name='repeat')
6. 计算占比并整理结果
合并总浏览次数和重复次数数据,填充无重复浏览的用户的重复次数为0,最后计算占比:
# 合并数据并填充缺失值 result = pd.merge(total_views, repeat_counts, on='id', how='left').fillna(0) # 计算占比 result['percentage'] = result['repeat'] / result['total'] # 整理输出结果 result = result[['id', 'percentage']].sort_values('id').reset_index(drop=True) print(result)
运行上述代码后,输出结果与示例完全一致:
id percentage 0 1 0.3 1 2 0.0 2 3 1.0
内容的提问来源于stack exchange,提问作者hurricane133
相关产品推荐
相关产品推荐

