python - Python删除第一个视图和第一次点击之间的所有行?
问题描述
所以我一直在尝试失败,希望能得到一些帮助。我想做的是
- 按用户分组并按时间戳排序(这是下面数据框的设置方式)
- 现在我想在第一次点击之前获取每个视图,并将其分组为具有最早时间戳的单个事件
- 或者,删除第一个视图和第一次单击之间的所有内容
- 如果他们没有点击,只有视图,所有行都应该被展平成一行
在某些情况下,我们正在收集数据,但由于观看次数的计算方式出现错误,每个新会话都会在会话开始时创建大量额外的观看次数。
因此,出于这个原因,我们希望在点击之前摆脱所有视图,除了第一个视图。如果特定用户没有点击,那么唯一剩下的应该是第一个视图。在第一次点击之后,视图被正确收集,所以我们想保留这些。
因此,如果输入如下(使用整数作为时间戳以使其更容易)
将熊猫导入为 pd
in = {'id': [123, 123, 123, 123, 234, 234,234, 234, 234, 234, 456, 456, 456],
'activity': ['view','view','click','click','view','view','view','click', 'view', 'click', 'view', 'view', 'view'] ,
'timestamp': [1, 2,3,4,1,2,3,4,5,6,1,2,3]}
pd.DataFrame(in)
输出应该是
out = {'id': [123, 123, 123, 234, 234, 234, 234, 456],
'activity': ['view','click','click','view','click','view', 'click', 'view'] ,
'timestamp': [1, 3,4,1,4,5,6,1,]}
pd.DataFrame(out)
如果有人对如何解决此问题有任何想法,将不胜感激!
解决方案
请按照以下步骤操作
s1=df.activity.eq('view').groupby(df['id']).transform('idxmax')
# using idxmax find the first view
s2=df.activity.eq('click').groupby(df['id']).transform('idxmax')
# same logic here find the index of first click
out=df.loc[(df.index<=s1)|(df.index>=s2)].copy()
# filter the original df by bool get from above
在这里,我们对唯一有视图的 id 进行调整
adjustonlyview=out.activity.eq('view').groupby(df['id']).transform('all')
# find those id out
idx_to_drop=out[adjustonlyview].duplicated('id')
# using duplicate find the the row we do not want to keep
idx_to_drop=idx_to_drop[idx_to_drop].index
# get the index of the row we need to drop
out.drop(idx_to_drop,axis=0,inplace=True) # drop it
Out[286]:
id activity timestamp
0 123 view 1
2 123 click 3
3 123 click 4
4 234 view 1
7 234 click 4
8 234 view 5
9 234 click 6
10 456 view 1
推荐阅读
- laravel - Laravel 多键集合分组
- vue.js - 扩展 vuetify v-btn 组件,添加自定义点击事件
- python - 如何从具有透明背景的图像中制作二进制蒙版?
- docker - 使用 Kubernetes 和 Docker Destop for Windows 设置持久卷
- video - ffmpeg — 如何从视频中提取所有帧,然后从提取的帧中精确重建视频?
- python - django填库数据迁移失败
- ios - 无法快速解析字典
- c# - Xamarin:显示存储在本地 IIS 服务器上的图像
- python - 在 Python 中绘制多项式回归
- html - css grid object-fit:覆盖在Firefox中不起作用?