在不使用 for 循环的情况下对 pandas groupby 应用重采样函数

apply resample function on pandas groupby without using for loop

我有一个像这样的 DataFrame:


    item_id     facility_id timestamp            min_inv     current_inv    demand
0   12          1185        2022-01-11 00:00:00  2.0         3.0            1
1   12          1185        2022-01-11 01:00:00  2.0         3.0            1
2   12          1185        2022-01-11 02:00:00  2.0         3.0            2
3   12          1185        2022-01-11 03:00:00  2.0         3.0            2
4   12          1185        2022-01-11 04:00:00  2.0         3.0            1
5   23          1185        2022-01-11 00:00:00  2.0         3.0            1
6   23          1185        2022-01-11 01:00:00  2.0         3.0            2
7   23          1185        2022-01-11 02:00:00  2.0         3.0            1
8   23          1185        2022-01-11 03:00:00  2.0         3.0            2
9   23          1185        2022-01-11 04:00:00  2.0         3.0            1
10  34          1185        2022-01-11 00:00:00  2.0         3.0            1
11  34          1185        2022-01-11 01:00:00  2.0         3.0            1
12  34          1185        2022-01-11 02:00:00  2.0         3.0            4
13  34          1185        2022-01-11 03:00:00  2.0         3.0            2
14  34          1185        2022-01-11 04:00:00  2.0         3.0            2
15  45          1185        2022-01-11 00:00:00  2.0         3.0            3
16  45          1185        2022-01-11 01:00:00  2.0         3.0            2
17  45          1185        2022-01-11 02:00:00  2.0         3.0            3
18  45          1185        2022-01-11 03:00:00  2.0         3.0            1
19  45          1185        2022-01-11 04:00:00  2.0         3.0            3

我想分组 item_id 并每 2 小时重新采样一次。在重采样中,我想对不同的列使用不同的 aggfunc。

我这样做的方式是:

tmp = input_df.groupby('item_id')
new_df = pd.DataFrame()
for group, df in tmp:
    tmp_df = df.set_index('timestamp').resample('2H').agg({'current_inv':'last',
                                                           'min_inv':'last',
                                                           'demand':'sum'})
    tmp_df['item_id'] = group

    new_df = pd.concat([new_df, tmp_df])

new_df 给出输出。

是否有更多的 pythonic 方法可以做到这一点?我不想使用 for 循环。

IIUC,您可以使用 on='timestamp' 作为 resample 方法的参数,以矢量化方式获得预期结果:

out = df.groupby('item_id').resample('2H', on='timestamp') \
        .agg({'current_inv': 'last', 'min_inv':'last', 'demand':'sum'}).reset_index()
print(out)

# Output
    item_id           timestamp  current_inv  min_inv  demand
0        12 2022-01-11 00:00:00          3.0      2.0       2
1        12 2022-01-11 02:00:00          3.0      2.0       4
2        12 2022-01-11 04:00:00          3.0      2.0       1
3        23 2022-01-11 00:00:00          3.0      2.0       3
4        23 2022-01-11 02:00:00          3.0      2.0       3
5        23 2022-01-11 04:00:00          3.0      2.0       1
6        34 2022-01-11 00:00:00          3.0      2.0       2
7        34 2022-01-11 02:00:00          3.0      2.0       6
8        34 2022-01-11 04:00:00          3.0      2.0       2
9        45 2022-01-11 00:00:00          3.0      2.0       5
10       45 2022-01-11 02:00:00          3.0      2.0       4
11       45 2022-01-11 04:00:00          3.0      2.0       3