首页 > 解决方案 > 如何为 pandas 数据框中的不同组分配唯一 ID?

问题描述

如何根据特定条件为在 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 于 2018 年 4 月 27 日在 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

谢谢您的帮助!链接到上一个问题:如何比较熊猫数据框中第二列的值与第一列的相同值?

标签: pythonpandasdatetimepandas-groupby

解决方案


sort并找出'td'连续动作的时间差 ( )。cumsum一个布尔系列,在最后一个动作的 30 分钟内形成一组连续动作。ngroup标记组。

如果您不关心组获得哪个标签,则可以删除 groupby 之前的sort_index,但这可以确保它们是根据原始顺序排序的。

df = df.sort_values(['Name', 'Datetime'])
df['td'] = df.Datetime.diff().mask(df.Name.ne(df.Name.shift()))
                             # Only calculate diff within same Name
df['Id'] = (df.sort_index()
              .groupby(['Name', df['td'].gt(pd.Timedelta('30min')).cumsum()], sort=False)
              .ngroup()+1)
df = df.sort_index()

输出:

td为清楚起见留下

     Name            Datetime       td  Id
0     Bob 2018-04-26 12:00:00      NaT   1
1  Claire 2018-04-26 12:00:00      NaT   2
2     Bob 2018-04-26 12:10:00 00:10:00   1
3     Bob 2018-04-26 12:30:00 00:20:00   1
4   Grace 2018-04-27 08:30:00      NaT   3
5     Bob 2018-04-27 09:30:00 21:00:00   4
6     Bob 2018-04-27 09:40:00 00:10:00   4
7     Bob 2018-04-27 10:00:00 00:20:00   4
8     Bob 2018-04-27 10:30:00 00:30:00   4
9     Bob 2018-04-27 11:30:00 01:00:00   5

推荐阅读