如何根据特定条件为 pandas 数据框中创建的组分配唯一 ID。
例如:我有一个名为 df 的数据框,其结构如下:名称标识用户,日期时间标识用户访问资源的日期/时间。
Name Datetime
Bob 26-04-2018 12:00:00
Claire 26-04-2018 12:00:00
Bob 26-04-2018 12:10:00
Bob 26-04-2018 12:30:00
Grace 27-04-2018 08:30:00
Bob 27-04-2018 09:30:00
Bob 27-04-2018 09:40:00
Bob 27-04-2018 10:00:00
Bob 27-04-2018 10:30:00
Bob 27-04-2018 11:30:00
我想为用户创建会话,这样,具有相同名称和日期时间值的用户访问资源的时间不超过 30 分钟,就会被分配一个唯一的会话。但是,如果用户在访问资源时表现出超过 30 分钟的不活动状态,则下次用户访问资源时,将为同一用户分配不同的会话。
我的预期输出将如图所示。
用户 Bob 于 27-04-2018 于 9.30 访问资源,第二次 @ 9.40,第三次 @ 10.00,第四次 @10.30 -> 均使用会话 4。但下次用户 Bob 访问 @ 11.30,因此时间差超过 30 分钟由于 Bob 已超过 30 分钟不活动,因此下一个会话将分配给他。
Name Datetime Id
Bob 26-04-2018 12:00:00 1
Claire 26-04-2018 12:00:00 2
Bob 26-04-2018 12:10:00 1
Bob 26-04-2018 12:30:00 1
Grace 27-04-2018 08:30:00 3
Bob 27-04-2018 09:30:00 4
Bob 27-04-2018 09:40:00 4
Bob 27-04-2018 10:00:00 4
Bob 27-04-2018 10:30:00 4
Bob 27-04-2018 11:30:00 5
感谢您的帮助!
上一个问题的链接:如何比较 pandas 数据框中第二列的值与第一列的相同值? https://stackoverflow.com/q/56960065/3873482
您在底部的解释对于理解它确实很有帮助。
你需要进行分组Name
and a groupID
(不要混淆这个groupID
与你的最后Id
)并致电ngroup
回来Id
。主要是如何定义这个groupID
。创造groupID
, 你需要sort_values
将每个分开Name
and Datetime
升序排列。通过...分组Name
并找出差异Datetime
每组内的连续行之间Name
(在同一Name
)。使用gt
检查超过30分钟并且cumsum
to get groupID
. sort_index
反转回原始顺序并分配给s
如下:
s = df.sort_values(['Name','Datetime']).groupby('Name').Datetime.diff() \
.gt(pd.Timedelta(minutes=30)).cumsum().sort_index()
接下来,分组Name
and s
with sort=False
保留原始订单并致电ngroup
plus 1.
df['Id'] = df.groupby(['Name', s], sort=False).ngroup().add(1)
Out[834]:
Name Datetime Id
0 Bob 2018-04-26 12:00:00 1
1 Claire 2018-04-26 12:00:00 2
2 Bob 2018-04-26 12:10:00 1
3 Bob 2018-04-26 12:30:00 1
4 Grace 2018-04-27 08:30:00 3
5 Bob 2018-04-27 09:30:00 4
6 Bob 2018-04-27 09:40:00 4
7 Bob 2018-04-27 10:00:00 4
8 Bob 2018-04-27 10:30:00 4
9 Bob 2018-04-27 11:30:00 5
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)