如何用Pandas查找患者就诊预约前后的最近检测结果?
解决思路与代码实现
数据预处理:先排序
首先把合并后的DataFrame按患者+日期升序排列,这是后续匹配最近日期的基础:
df_sorted = df.sort_values(['patient', 'date']).reset_index(drop=True)
方法一:分组填充法(适合小数据集)
利用分组后的向前/向后填充,给每个预约日期匹配前后最近的检测值和日期:
# 提取仅检测记录有值的临时列 df_sorted['test_val'] = df_sorted['value'].where(df_sorted['event'] == '检测') df_sorted['test_dt'] = df_sorted['date'].where(df_sorted['event'] == '检测') # 分组后向前填充,得到预约日期前最近的检测数据 df_sorted['last_test_val'] = df_sorted.groupby('patient')['test_val'].ffill() df_sorted['last_test_dt'] = df_sorted.groupby('patient')['test_dt'].ffill() # 分组后向后填充,得到预约日期后最近的检测数据 df_sorted['next_test_val'] = df_sorted.groupby('patient')['test_val'].bfill() df_sorted['next_test_dt'] = df_sorted.groupby('patient')['test_dt'].bfill() # 筛选出所有预约记录,就是最终结果 final_df = df_sorted[df_sorted['event'] == '预约'].drop(columns=['test_val', 'test_dt'])
方法二:merge_asof法(高效适合大数据集)
Pandas的merge_asof是专门用于按日期匹配最近邻记录的工具,速度更快:
1. 拆分数据集
先把预约和检测数据拆成两个单独的DataFrame:
appt_df = df[df['event'] == '预约'][['patient', 'date']].rename(columns={'date': 'appt_date'}) test_df = df[df['event'] == '检测'][['patient', 'date', 'value']].rename(columns={'date': 'test_date', 'value': 'test_val'})
2. 匹配预约前最近的检测
last_test_match = pd.merge_asof( appt_df.sort_values('appt_date'), test_df.sort_values('test_date'), by='patient', left_on='appt_date', right_on='test_date', direction='backward' # 找小于等于预约日期的最近检测 )
3. 匹配预约后最近的检测
next_test_match = pd.merge_asof( appt_df.sort_values('appt_date'), test_df.sort_values('test_date'), by='patient', left_on='appt_date', right_on='test_date', direction='forward' # 找大于等于预约日期的最近检测 )
4. 合并结果
把前后匹配的结果合并到一起:
final_result = pd.merge( last_test_match, next_test_match[['patient', 'appt_date', 'test_date', 'test_val']], on=['patient', 'appt_date'], suffixes=('_last', '_next') )
关键注意点
- 确保
date字段是datetime类型,否则排序和匹配会出错,提前用df['date'] = pd.to_datetime(df['date'])转换 - 如果预约日期前后没有检测记录,对应字段会出现NaN,可根据业务需求做填充或过滤
内容的提问来源于stack exchange,提问作者Xiaoming Zeng
相关产品推荐
相关产品推荐

