You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python如何基于pandas DataFrame多条件规则新增列计算疫苗第二剂接种日期

pandas多条件动态生成疫苗第二剂接种日期列的正确实现方式

错误原因

你之前的写法存在两个核心问题:

  1. 直接整列赋值时,只有符合当前筛选条件的行有计算结果,其余行为空值,后续赋值会直接覆盖整列数据,导致前序疫苗的计算结果丢失
  2. df[criteria_Pfizer].loc[:,'New_Column'] 属于链式索引操作,pandas无法确认筛选出的是原数据的视图还是拷贝,因此触发赋值告警。

解决方案1:使用.loc 精准行/列赋值

这是最贴近你原有写法的修正方案,通过loc[行条件, 列名]的语法直接操作原DataFrame,避免链式索引,同时仅修改符合条件的行,不会覆盖其余行的已有结果:

import pandas as pd
from datetime import timedelta

# 读取csv后先确认首剂接种日期列为datetime类型,避免后续时间运算报错
df['firstVaccineDate'] = pd.to_datetime(df['firstVaccineDate'])
# 初始化第二剂推荐日期列为日期类型空值
df['second_dose_recommend'] = pd.NaT

# 分别为不同疫苗符合条件的行赋值
df.loc[criteria_CoronaVac, 'second_dose_recommend'] = df.loc[criteria_CoronaVac, 'firstVaccineDate'] + timedelta(days=days_coronaVac)
df.loc[criteria_Pfizer, 'second_dose_recommend'] = df.loc[criteria_Pfizer, 'firstVaccineDate'] + timedelta(days=days_pfizer)
df.loc[criteria_Astrazeneca, 'second_dose_recommend'] = df.loc[criteria_Astrazeneca, 'firstVaccineDate'] + timedelta(days=days_astraZeneca)

解决方案2:使用np.select 批量处理多条件分支

如果后续需要新增更多疫苗类型,这种写法更简洁易维护,一次完成所有条件的匹配和计算:

import pandas as pd
import numpy as np
from datetime import timedelta

df['firstVaccineDate'] = pd.to_datetime(df['firstVaccineDate'])
# 按顺序定义条件列表与对应的间隔天数,顺序一一对应
conditions = [criteria_CoronaVac, criteria_Pfizer, criteria_Astrazeneca]
add_days = [days_coronaVac, days_pfizer, days_astraZeneca]

# 匹配条件得到对应间隔天数,转换为时间差后与首剂日期相加,未匹配到的行返回空值
df['second_dose_recommend'] = df['firstVaccineDate'] + pd.to_timedelta(np.select(conditions, add_days, default=np.nan), unit='D')

内容的提问来源于stack exchange,提问作者José Goulart

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 03:45:07