我怎样才能通过 Pandas groupby 循环并操作数据?

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)

我正在努力寻找一种方法来做到这一点,所以我转向了伟人。

请帮忙。提前致谢。

jez*_*ael 2

将列转换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)

  • 实际上我在想也许 OP 也想按“位置”进行分组,但样本中没有大小> 1 的示例。因此,也许可以按 ID、位置对值进行排序,并首先保留,然后按“ID”进行分组。现在需要走了,这就是我这么说的原因:) (2认同)