使用pivot_table 转换您的数据框:
# Use a clean dataframe
df['time'] = pd.to_datetime(df['time'])
df = df.sort_values('time')
out = df.pivot_table(index=['user', df['time'].dt.date], columns='action',
values='time', aggfunc='last').reset_index()
out['daily_avg'] = out.groupby(['user', 'time'], as_index=False) \
.apply(lambda x: x['step 2'] - x['step 1']).values
out = out.groupby('user')['daily_avg'].mean().reset_index()
输出结果:
>>> out
user daily_avg
0 2160 0 days 00:01:35
1 3249 0 days 00:11:51
2 3900 0 days 00:25:03
3 5120 NaT
我的设置(我稍微修改了你的数据框):
data = {'user': [3249, 2160, 2160, 3249, 5120, 3900, 3900, 3900, 3900, 3900], 'action': ['step 1', 'step 1', 'step 2', 'step 2', 'step 1', 'step 1', 'step 1', 'step 2', 'step 1', 'step 2'], 'time': ['2021-10-25 19:45:43', '2021-10-25 19:48:46', '2021-10-25 19:50:21', '2021-10-25 19:57:34', '2021-10-25 20:30:56', '2021-10-25 20:35:40', '2021-10-25 20:50:59', '2021-10-25 21:15:08', '2021-10-26 18:23:41', '2021-10-26 18:49:38']}
df = pd.DataFrame(data)
print(df)
# Output
user action time
0 3249 step 1 2021-10-25 19:45:43
1 2160 step 1 2021-10-25 19:48:46
2 2160 step 2 2021-10-25 19:50:21
3 3249 step 2 2021-10-25 19:57:34
4 5120 step 1 2021-10-25 20:30:56
5 3900 step 1 2021-10-25 20:35:40
6 3900 step 1 2021-10-25 20:50:59
7 3900 step 2 2021-10-25 21:15:08
8 3900 step 1 2021-10-26 18:23:41 # added
9 3900 step 2 2021-10-26 18:49:38 # added