Oli*_*say 5 python pandas pandas-groupby
我正在尝试计算分组熊猫 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
Run Code Online (Sandbox Code Playgroud)
我使用以下方法对其进行了分组:
ndf = df.groupby(['ID','Location','Time'])
Run Code Online (Sandbox Code Playgroud)
如果我添加.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
(...)
Run Code Online (Sandbox Code Playgroud)
这是所期望的。
我的挑战是我需要计算每个 Item 每次之间的时间增量,并将其添加为数据帧分组中的一列。它应该给我以下内容:
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
(...)
Run Code Online (Sandbox Code Playgroud)
我正在努力寻找一种方法来做到这一点,所以我转向了伟人。
请帮忙。提前致谢。
将列转换Time为 timedeltas by to_timedelta,按所有 3 列排序DataFrame.sort_values,按组获取差异DataFrameGroupBy.diff,将缺失值替换为0 timedeltaby Series.fillna:
#if strings astype should be omit
df['Time'] = pd.to_timedelta(df['Time'].astype(str))
df = df.sort_values(['ID','Location','Time'])
Run Code Online (Sandbox Code Playgroud)
df['Delta'] = df.groupby('ID')['Time'].diff().fillna(pd.Timedelta(0))
Run Code Online (Sandbox Code Playgroud)
也可以将 timedeltas 转换为秒 - 添加Series.dt.total_seconds:
df['Delta_sec'] = df.groupby('ID')['Time'].diff().dt.total_seconds().fillna(0)
Run Code Online (Sandbox Code Playgroud)