如何用Python Pandas计算DataFrame中订单分组间的时间差
问题描述
现有一个包含order_id、time和item_id字段的Pandas DataFrame,每个订单组(如A、B、C)内的订单时间一致:
order_id time item_id 0 A 2022-11-10 08:43:07 1 1 A 2022-11-10 08:43:07 2 2 A 2022-11-10 08:43:07 3 3 B 2022-11-10 08:46:27 1 4 B 2022-11-10 08:46:27 2 5 C 2022-11-10 08:58:45 3
需要按时间顺序计算相邻订单组(A与B、B与C)的时间差,并存入新列time_diff,期望结果如下:
order_id time item_id time_diff 0 A 2022-11-10 08:43:07 1 1 A 2022-11-10 08:43:07 2 2 A 2022-11-10 08:43:07 3 3 B 2022-11-10 08:46:27 1 0 days 00:03:20 4 B 2022-11-10 08:46:27 2 0 days 00:03:20 5 C 2022-11-10 08:58:45 3 0 days 00:12:18
尝试df.groupby('order_id')['time'].diff()仅得到组内时间差,不符合需求;而df.groupby('order_id')['time'].last().diff()能得到正确的分组间差值,但不知道如何合并回原DataFrame。
解决方法
方法1:通过map映射时间差
先计算每个订单组的时间差,再利用order_id将差值映射到原DataFrame的对应行:
import pandas as pd # 确保time列是datetime类型 df['time'] = pd.to_datetime(df['time']) # 计算每个订单组的时间差并转为DataFrame grouped_diff = df.groupby('order_id')['time'].last().diff().reset_index() # 将时间差映射到原DataFrame df['time_diff'] = df['order_id'].map(grouped_diff.set_index('order_id')['time_diff']) # 可选:将NaT替换为空字符串,匹配期望格式 df['time_diff'] = df['time_diff'].astype(str).replace('NaT', '')
方法2:用transform直接广播差值
利用transform方法在分组后直接计算全局差值,并自动广播到组内所有行:
import pandas as pd df['time'] = pd.to_datetime(df['time']) # 按订单组取首条时间,计算全局时间差后广播到组内 df['time_diff'] = df.groupby('order_id')['time'].transform('first').diff() # 可选:替换NaT为空字符串 df['time_diff'] = df['time_diff'].astype(str).replace('NaT', '')
方法3:通过merge合并结果
如果偏好合并操作,可将分组后的时间差结果与原DataFrame按order_id关联:
import pandas as pd df['time'] = pd.to_datetime(df['time']) # 生成带时间差的订单组DataFrame grouped_diff = df.groupby('order_id')['time'].last().diff().to_frame('time_diff').reset_index() # 合并到原DataFrame df = df.merge(grouped_diff, on='order_id', how='left') # 可选:替换NaT为空字符串 df['time_diff'] = df['time_diff'].astype(str).replace('NaT', '')
内容的提问来源于stack exchange,提问作者tumir
相关产品推荐
相关产品推荐

