如何在Pandas中按ID匹配DataFrame并计算时间差
解决方法
不用纠结groupby,用**合并(merge)**关联两个DataFrame是更直接的方案,步骤如下:
统一时间格式:先确保两个DataFrame的时间列都是
datetime类型(如果不是,先转换):import pandas as pd # 转换入院时间列格式 df1['admissiontime'] = pd.to_datetime(df1['admissiontime']) # 转换df2的记录时间列格式 df2['datetime'] = pd.to_datetime(df2['datetime'])关联入院时间到df2:利用
merge把df1中每个id对应的唯一入院时间匹配到df2的每条记录上:# 只保留df1的id和admissiontime列做合并,避免引入多余字段 df_merged = df2.merge(df1[['id', 'admissiontime']], on='id', how='left')how='left'会保留df2的所有原始记录,如果某个id在df1中不存在,对应的admissiontime会是NaN,后续时间差也会为NaN。
计算时间差:直接用两列时间相减得到
Timedelta类型的结果,也可以按需转换成小时、天数等数值格式:# 生成原始时间差(Timedelta类型,显示为X days X hours:minutes:seconds) df_merged['time_diff'] = df_merged['datetime'] - df_merged['admissiontime'] # 可选:转换为总小时数(浮点型) df_merged['time_diff_hours'] = df_merged['time_diff'].dt.total_seconds() / 3600 # 可选:转换为天数(整数型,只取整数部分) df_merged['time_diff_days'] = df_merged['time_diff'].dt.days
如果一定要用groupby实现,可以借助字典映射:
# 把df1转换成id映射到入院时间的字典 admission_map = df1.set_index('id')['admissiontime'].to_dict() # 按id分组后,给每组的datetime匹配对应入院时间并计算差值 df2['time_diff'] = df2.groupby('id')['datetime'].transform( lambda group: group - admission_map[group.name] )
这种方法需要确保df2的所有id都在df1中存在,否则会触发KeyError,不如merge方案容错性高。
内容的提问来源于stack exchange,提问作者Gwénolé
相关产品推荐
相关产品推荐

