如何遍历大熊猫groupby并处理数据?

时间:2019-05-21 10:32:07

标签: 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

我使用以下方法将其分组:

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
(...)

我正在抽出头发,试图找到一种方法来做到这一点,所以我转向了伟人。

请帮助。预先感谢。

2 个答案:

答案 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行或更多行却不是很好。