如何用两日期列的平均差值填充缺失/错误的date_of_incident值?
解决方法
步骤1:先基于有效数据计算差值均值
首先要排除有问题的行,用正常数据计算dt_diff的均值,避免错误值拉偏结果:
# 筛选出date_of_incident非空、且差值在合理范围的行(比如排除差值绝对值超过365天的异常值) valid_rows = df[(df['date_of_incident'].notna()) & (df['dt_diff'].dt.days.abs() <= 365)] # 将均值转为Timedelta类型,方便后续日期运算 avg_dt_diff = pd.to_timedelta(valid_rows['dt_diff'].mean())
步骤2:定义需要插补的行的条件
明确两种需要替换的情况:
date_of_incident为缺失值(NaN)date_of_incident明显不合理(比如和treatment_date的差值异常,或年份远早于治疗日期)
# 条件1:date_of_incident缺失 cond_missing = df['date_of_incident'].isna() # 条件2:差值异常(可根据业务调整阈值,比如这里设为超过365天)或日期年份异常 cond_invalid = (df['dt_diff'].dt.days.abs() > 365) | (df['date_of_incident'].dt.year < df['treatment_date'].dt.year - 10) # 合并两个条件,定位所有需要插补的行 replace_cond = cond_missing | cond_invalid
步骤3:批量插补有问题的行
用loc精准定位目标行,应用公式计算新的date_of_incident:
# 对符合条件的行执行插补 df.loc[replace_cond, 'date_of_incident'] = df.loc[replace_cond, 'treatment_date'] - avg_dt_diff
验证插补结果
可以快速检查插补情况:
print(f"共完成 {replace_cond.sum()} 行数据的插补") # 随机查看部分插补后的数据 print(df[replace_cond].head())
补充提示
- 如果有更明确的错误数据判断标准(比如固定年份阈值),直接调整
cond_invalid的逻辑即可 - 因为数据集规模小,插补后建议手动抽查部分结果,确保符合医疗场景的业务逻辑
内容的提问来源于stack exchange,提问作者Kevin O'Leary
相关产品推荐
相关产品推荐

