You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用宽格式DataFrame的时间戳拆分长格式DataFrame

解决方法

你可以通过表关联+向量化判断的方式快速实现需求,全程只需要3步,性能远优于循环遍历匹配的写法:

1. 关联两个表,把对应ID的起始时间合并到检验表

因为df1的ID是唯一值,用左连接即可,不会给df2生成多余行:

import pandas as pd
import numpy as np

# 你的示例数据
data = {'ID': ['MR1','MR2','MR3'], 'Start_time':[11, 12, 1]}
data2= {'ID': ['MR1','MR1','MR1','MR2','MR2','MR2'],'Order_time':[11,1,4,10,12,2],'lab_value':[10,14,12,10,8,16]}
df1=pd.DataFrame(data)
df2=pd.DataFrame(data2)

# 合并获取对应ID的Start_time
df_merged = df2.merge(df1[['ID', 'Start_time']], on='ID', how='left')

2. 标记每条检验记录属于检验前还是检验后

推荐用numpy的向量化判断,数据量越大性能优势越明显,你可以根据业务需求调整>=的边界规则,比如把等于Start_time的情况归到检验前:

# 规则:Order_time >= Start_time 标记为检验后,否则为检验前
df_merged['time_type'] = np.where(df_merged['Order_time'] >= df_merged['Start_time'], '检验后', '检验前')

如果是实际场景的datetime时间类型数据,上述比较逻辑完全通用,不需要额外修改。

3. 拆分数据/生成宽格式表

如果需要拆分出两个独立的数据集:

pre_test_df = df_merged[df_merged['time_type'] == '检验前'].reset_index(drop=True)
post_test_df = df_merged[df_merged['time_type'] == '检验后'].reset_index(drop=True)

如果要直接生成最终的宽格式表,可以直接用透视表聚合后和df1的人口信息合并:

# 示例:按ID聚合检验前后的检验值均值,生成宽表
wide_result = df_merged.pivot_table(
    index='ID',
    columns='time_type',
    values='lab_value',
    aggfunc='mean' # 可按需替换为sum、max、count等聚合规则
).reset_index()

# 合并回原df1的人口统计信息
wide_result = wide_result.merge(df1, on='ID', how='left')

内容的提问来源于stack exchange,提问作者Joshua

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 00:48:03