如何使用宽格式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
相关产品推荐
相关产品推荐

