【问题标题】:Determining group size based entry and exit times of IDs in my df在我的 df 中确定基于组大小的 ID 的进入和退出时间
【发布时间】:2020-04-15 07:42:36
【问题描述】:

这给了我 df 中 ID 的进入和退出时间:

minmax = merge_df.groupby(['id'])['date'].agg([min, max])

result

id   min                 max

4900 2019-09-17 08:43:06 2019-09-17 09:38:20
4909 2019-09-17 08:43:06 2019-09-17 09:16:00
4911 2019-09-17 08:43:06 2019-09-17 09:43:58
4965 2019-09-17 09:27:14 2019-09-17 09:38:28
5134 2019-09-17 09:34:26 2019-09-17 09:38:27
5139 2019-09-17 09:37:03 2019-09-17 09:46:19
5141 2019-09-17 09:37:22 2019-09-17 12:06:30
5163 2019-09-17 09:38:03 2019-09-17 10:18:29
5170 2019-09-17 09:38:19 2019-09-17 12:47:49

这就是我的 DF 结构的样子:

df

date                    x   y   id  

2019-09-17 08:43:06     206 210 4900
2019-09-17 08:43:06     234 236 4909
2019-09-17 08:43:06     251 222 4911
2019-09-17 08:43:07     231 244 4909
2019-09-17 08:43:07     252 222 4911
2019-09-17 08:43:07     207 210 4965
2019-09-17 08:43:08     234 250 5163
2019-09-17 08:43:08     252 222 4911
2019-09-17 08:43:08     206 210 4900
2019-09-17 08:43:09     252 222 4911
2019-09-17 08:43:09     206 210 4900
2019-09-17 08:43:09     223 247 4909
2019-09-17 08:43:10     206 210 4900
2019-09-17 08:43:10     229 237 4909
2019-09-17 08:43:10     252 222 4911
2019-09-17 08:43:12     226 241 4909

如何在我的 DF 中创建一个新列,比较给定秒内 ID 的入口点,如果它们出现在同一时间范围内(例如同一分钟),那么我想得到类似的东西插入分组大小,如下所示:

df

date                    x   y   id      groupsize

2019-09-17 08:43:06     206 210 4900    3
2019-09-17 08:43:06     234 236 4909    3
2019-09-17 08:43:06     251 222 4911    3
2019-09-17 08:43:07     231 244 4909    3
2019-09-17 08:43:07     252 222 4911    3
2019-09-17 08:43:07     207 210 4965    1
2019-09-17 08:43:08     234 250 5134    1
2019-09-17 08:43:08     252 222 5139    2
2019-09-17 08:43:08     206 210 4900    3
2019-09-17 08:43:09     252 222 4911    3
2019-09-17 08:43:09     206 210 4900    3
2019-09-17 08:43:09     223 247 4909    3
2019-09-17 08:43:10     206 210 5141    2
2019-09-17 08:43:10     229 237 4909    3
2019-09-17 08:43:10     252 222 5163    2
2019-09-17 08:43:12     226 241 5170    2

我该怎么做?这是任何人都可以帮助我的吗?

感谢任何提示!

【问题讨论】:

  • 什么决定了组的大小?
  • 分组大小由给定秒内的不同 ID 确定,仅考虑在相似时间范围内出现在数据集中的那些 ID(可以定义为 S 间隔)。这有意义吗?所以第一个分组大小是 3,因为 ID 4900,4909 和 4911 都出现在第二个 6。而 ID 4965 在第二个 7 单独出现,因此分组大小是 1。
  • 知道了,查看解决方案。

标签: python pandas datetime group-by


【解决方案1】:

IIUC,首先让我们将最小值和最大值合并到您的数据框结构中

import pandas as pd
import numpy as np
df3 = pd.merge(df,minmax,on='id',how='left')
                  date    x    y    id                 min                 max
0  2019-09-17 08:43:06  206  210  4900 2019-09-17 08:43:06 2019-09-17 09:38:20
1  2019-09-17 08:43:06  234  236  4909 2019-09-17 08:43:06 2019-09-17 09:16:00
2  2019-09-17 08:43:06  251  222  4911 2019-09-17 08:43:06 2019-09-17 09:43:58
3  2019-09-17 08:43:07  231  244  4909 2019-09-17 08:43:06 2019-09-17 09:16:00
4  2019-09-17 08:43:07  252  222  4911 2019-09-17 08:43:06 2019-09-17 09:43:58
5  2019-09-17 08:43:07  207  210  4965 2019-09-17 09:27:14 2019-09-17 09:38:28
6  2019-09-17 08:43:08  234  250  5163 2019-09-17 09:38:03 2019-09-17 10:18:29
7  2019-09-17 08:43:08  252  222  4911 2019-09-17 08:43:06 2019-09-17 09:43:58
8  2019-09-17 08:43:08  206  210  4900 2019-09-17 08:43:06 2019-09-17 09:38:20
9  2019-09-17 08:43:09  252  222  4911 2019-09-17 08:43:06 2019-09-17 09:43:58
10 2019-09-17 08:43:09  206  210  4900 2019-09-17 08:43:06 2019-09-17 09:38:20
11 2019-09-17 08:43:09  223  247  4909 2019-09-17 08:43:06 2019-09-17 09:16:00
12 2019-09-17 08:43:10  206  210  4900 2019-09-17 08:43:06 2019-09-17 09:38:20
13 2019-09-17 08:43:10  229  237  4909 2019-09-17 08:43:06 2019-09-17 09:16:00
14 2019-09-17 08:43:10  252  222  4911 2019-09-17 08:43:06 2019-09-17 09:43:58
15 2019-09-17 08:43:12  226  241  4909 2019-09-17 08:43:06 2019-09-17 09:16:00

然后让我们计算日期和最小值之间的绝对秒数。 如果您需要实际值,您可以按原样读取值,但您需要添加更多逻辑步骤来处理负值。

s = abs(df3['min'] - df3['date']) / np.timedelta64(1,'s') 
print(s)
0        0.0
1        0.0
2        0.0
3        1.0
4        1.0
5     2647.0
6     3295.0
7        2.0
8        2.0
9        3.0
10       3.0
11       3.0
12       4.0
13       4.0
14       4.0
15       6.0
dtype: float64

您可以通过多种方式执行此操作,但我将使用 .loc 按顺序设置您的值。

df3.loc[s <= 3, 'GroupSize'] = 3
df3.loc[(s > 3) & (s <= 7), 'GroupSize'] = 2
df3.loc[s > 7, 'GroupSize'] = 1

print(df3[['id','date','x','y','min','GroupSize']])
          id                date    x    y                 min  GroupSize
0   4900 2019-09-17 08:43:06  206  210 2019-09-17 08:43:06        3.0
1   4909 2019-09-17 08:43:06  234  236 2019-09-17 08:43:06        3.0
2   4911 2019-09-17 08:43:06  251  222 2019-09-17 08:43:06        3.0
3   4909 2019-09-17 08:43:07  231  244 2019-09-17 08:43:06        3.0
4   4911 2019-09-17 08:43:07  252  222 2019-09-17 08:43:06        3.0
5   4965 2019-09-17 08:43:07  207  210 2019-09-17 09:27:14        1.0
6   5163 2019-09-17 08:43:08  234  250 2019-09-17 09:38:03        1.0
7   4911 2019-09-17 08:43:08  252  222 2019-09-17 08:43:06        3.0
8   4900 2019-09-17 08:43:08  206  210 2019-09-17 08:43:06        3.0
9   4911 2019-09-17 08:43:09  252  222 2019-09-17 08:43:06        3.0
10  4900 2019-09-17 08:43:09  206  210 2019-09-17 08:43:06        3.0
11  4909 2019-09-17 08:43:09  223  247 2019-09-17 08:43:06        3.0
12  4900 2019-09-17 08:43:10  206  210 2019-09-17 08:43:06        2.0
13  4909 2019-09-17 08:43:10  229  237 2019-09-17 08:43:06        2.0
14  4911 2019-09-17 08:43:10  252  222 2019-09-17 08:43:06        2.0
15  4909 2019-09-17 08:43:12  226  241 2019-09-17 08:43:06        2.0

【讨论】:

  • 如果我可以给一个超级喜欢,我会的。非常感谢,我欠你的!
  • 谢谢!一个小问题。如果我现在想在一分钟内调整搜索,我是否只需将“s”调整为“m”?
  • @kkjjnn 是的,或者你可以做 > 60 秒 ;) 更多 here
  • 一个问题。我认为有些事情行不通。索引 12-14 有 3 个在同一秒开始的 ID,而 groupsize 显示为 2。你知道如何解决这个问题吗?
  • @kkjjnn 好吧,看起来 min 是从过去开始的,对于退出时间在日期时间之前的时间,您想要什么逻辑?
猜你喜欢
  • 2018-08-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多