在不使用 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
我有一个像这样的 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