我们可以groupby shift 相对于level=0 或level="sess_id" 得到下一行的值,并从time 中减去:
df['delta_t'] = df.groupby(level='sess_id')['time'].shift(-1) - df['time']
示例 DataFrame 和输出:
time delta_t
sess_id vis_id
id1 vis_id1 2021-01-11 00:00:00 6 days 04:27:31
vis_id1 2021-01-17 04:27:31 4 days 03:45:26
vis_id1 2021-01-21 08:12:57 NaT
id2 vis_id2 2021-01-28 15:18:32 7 days 17:57:56
vis_id2 2021-02-05 09:16:28 4 days 01:41:58
vis_id2 2021-02-09 10:58:26 NaT
我们可以 groupby diff 然后groupby shift 但这涉及到 2 个 groupbys:
df['delta_t'] = (
df.groupby(level='sess_id')['time'].diff()
.groupby(level='sess_id').shift(-1)
)
如果在NaT 上需要'-',可以使用np.where 将Timedelta 转换为字符串并用'-' 填充:
# Calculate Delta
df['delta_t'] = df.groupby(level='sess_id')['time'].shift(-1) - df['time']
# Change dtype and add in '-'
df['delta_t'] = np.where(df['delta_t'].notna(), df['time'].astype(str), '-')
或者可以用“-”转换为str和replace“NaT”:
# Calculate Delta, convert to String, replace "NaT" with "-"
df['delta_t'] = (
df.groupby(level='sess_id')['time'].shift(-1) - df['time']
).astype(str).replace('NaT', '-')
df:
time delta_t
sess_id vis_id
id1 vis_id1 2021-01-11 00:00:00 6 days 04:27:31
vis_id1 2021-01-17 04:27:31 4 days 03:45:26
vis_id1 2021-01-21 08:12:57 -
id2 vis_id2 2021-01-28 15:18:32 7 days 17:57:56
vis_id2 2021-02-05 09:16:28 4 days 01:41:58
vis_id2 2021-02-09 10:58:26 -
DataFrame 构造函数和导入:
import pandas as pd
df = pd.DataFrame(
{'time': pd.to_datetime(['2021-01-11 00:00:00', '2021-01-17 04:27:31',
'2021-01-21 08:12:57', '2021-01-28 15:18:32',
'2021-02-05 09:16:28', '2021-02-09 10:58:26'])},
index=pd.MultiIndex.from_arrays((['id1'] * 3 + ['id2'] * 3,
['vis_id1'] * 3 + ['vis_id2'] * 3),
names=['sess_id', 'vis_id'])
)