python - 根据我的 df 中 ID 的进入和退出时间确定组大小

标签 python pandas datetime group-by

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

minmax = merged_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

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

我很感激任何提示!

最佳答案

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

关于python - 根据我的 df 中 ID 的进入和退出时间确定组大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59465127/

相关文章:

python - Flask + SQLAlchemy 邻接表 backref 错误

python - 获取列的 [0, x] 元素的最小值

php - 为什么我的 IntlDateFormatter 格式化错误的日期?

c# - 设置日期时间格式 - C#

java - new Date() 在配置为 IST 的 ec2 实例中给出 UTC 时间

python - Web框架的局限性如何

python - 试图匹配python中字符串中两个系列字符中的第一个

python - 删除不在 Python 集合中的字符

python - 处理/转置 Pandas 数据框

numpy - SciPy PearsonR ValueError : The truth value of an array with more than one element is ambiguous. 使用 a.any() 或 a.all()