python - 如何为 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
谢谢您的帮助!链接到上一个问题:如何比较熊猫数据框中第二列的值与第一列的相同值?
解决方案
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
推荐阅读
- javascript - 如何使用 redux 从数据库中删除数据?
- entity-framework - 如何看到当前枚举器在实体框架中保持连接打开?
- python - 如何使用 subprocess.call 在 linux 中重新启动服务?
- message - 删除不和谐代码上的自己/个人聊天记录
- matlab - powf() 函数的奇怪行为
- python - 在 App Engine Python 中动态向 Google Datastore 实体添加属性(灵活的环境)
- reactjs - 如何使用 Rust 在 webview 中加载 WASM 模块?
- ruby - 为什么我会收到缺少必需键 [:id] 的 UrlGenerationError?
- clojure - 从调用 CLJS 函数的 CLJ 发出 Hiccup 控件
- c# - 在图形类中使用未分配的局部变量