我正在尝试计算分组熊猫df中值之间的时间增量。
我的df看起来像这样:
Location ID Item Qty Time
0 7 202545942 100130 1 07:19:46
1 8 202545943 100130 1 07:20:08
2 11 202545950 100130 1 07:20:31
3 13 202545955 100130 1 07:21:08
4 15 202545958 100130 1 07:21:18
5 18 202545963 100130 3 07:21:53
6 217 202546320 100130 1 07:22:43
7 219 202546324 100130 1 07:22:54
8 229 202546351 100130 1 07:23:32
9 246 202546376 100130 1 07:24:09
10 273 202546438 100130 1 07:24:37
11 286 202546464 100130 1 07:24:59
12 296 202546490 100130 1 07:25:16
13 297 202546491 100130 1 07:25:24
14 310 202546516 100130 1 07:25:59
15 321 202546538 100130 1 07:26:17
16 329 202546549 100130 1 07:28:09
17 388 202546669 100130 1 07:29:02
18 420 202546717 100130 2 07:30:01
19 451 202546766 100130 1 07:30:19
20 456 202546773 100130 1 07:30:27
(...)
42688 458 202546777 999969 1 06:51:16
42689 509 202546884 999969 1 06:53:09
42690 567 202546977 999969 1 06:54:21
42691 656 202547104 999969 1 06:57:27
我使用以下方法将其分组:
ndf = df.groupby(['ID','Location','Time'])
如果将.size()
添加到上述内容的末尾,而print(ndf)
则会得到以下输出:
(...)
ID Location Time
995812 696 07:10:36 1
730 07:11:41 1
761 07:12:30 1
771 07:20:49 1
995820 381 06:55:07 1
761 07:12:44 1
(...)
这是所需的。
我的挑战是,我需要计算每个项目每次之间的时间增量,并将其添加为数据框分组中的一列。它应该给我以下内容:
ID Location Time Delta
(...)
995812 696 07:10:36 0
730 07:11:41 00:01:05
761 07:12:30 00:00:49
771 07:20:49 00:08:19
995820 381 06:55:07 0
761 07:12:44 00:17:37
(...)
我正在抽出头发,试图找到一种方法来做到这一点,所以我转向了伟人。
请帮助。预先感谢。
答案 0 :(得分:2)
将Time
列转换为to_timedelta
的时间增量,按DataFrame.sort_values
按所有3列排序,按DataFrameGroupBy.diff
获得每组的差异,将缺失值替换为{{1} },Series.fillna
:
0 timedelta
#if strings astype should be omit
df['Time'] = pd.to_timedelta(df['Time'].astype(str))
df = df.sort_values(['ID','Location','Time'])
还可以将时间增量转换为秒-添加Series.dt.total_seconds
:
df['Delta'] = df.groupby('ID')['Time'].diff().fillna(pd.Timedelta(0))
答案 1 :(得分:1)
如果您只想遍历groupby对象,则可以根据原始问题标题进行操作:
for (x, y) in df.groupby(['ID','Location','Time']):
print("{0}, {1}".format(x, y))
# your logic
但是,这适用于10.000行,100.000行,但对于10 ^ 6行或更多行却不是很好。