如何用Python Pandas按月合并患者数据并保留最新非空值
用Pandas按月份合并患者数据并保留每月最新非空值
实现步骤与代码示例
假设你的患者数据包含Patient ID(患者ID)、日期及各类临床指标列,且已按日期升序排列。以下是具体实现方法:
- 导入依赖并加载数据
import pandas as pd # 加载你的数据(示例为CSV格式,可根据实际调整) df = pd.read_csv('patient_records.csv')
- 转换日期列为datetime类型
确保Pandas能正确识别日期字段,为后续分组做准备:
df['日期'] = pd.to_datetime(df['日期'])
- 创建年月分组键
提取日期中的年月信息,作为分组的依据:
df['年月'] = df['日期'].dt.to_period('M') # 生成如"2023-01"的年月对象
- 分组聚合,保留每月最新非空值
自定义函数提取每个分组内每列的最后一个非空值(即该月内最新的有效数据),再按患者ID+年月分组聚合:
def get_last_valid_value(series): # 筛选非空值,若存在则取最后一个(对应最新记录),否则返回空值 valid_values = series.dropna() return valid_values.iloc[-1] if not valid_values.empty else pd.NA # 按患者ID和年月分组,应用自定义函数聚合 merged_df = df.groupby(['Patient ID', '年月']).agg(get_last_valid_value).reset_index()
- 可选:将年月转换为日期格式
如果需要将年月列转换为具体日期(如每月最后一天),可执行:
merged_df['年月'] = merged_df['年月'].dt.to_timestamp(how='end')
关键逻辑说明
- 分组依据:通过
Patient ID+年月确保每个患者每月仅保留一条合并记录。 - 聚合逻辑:
get_last_valid_value函数针对每列,只保留该月内最后出现的非空值,完全匹配你需要的"最新非空"要求。 - 原始数据排序:因为你的数据已按日期升序排列,所以分组内的最后一个非空值就是该月的最新有效数据。
内容的提问来源于stack exchange,提问作者Natali
相关产品推荐
相关产品推荐

