Python如何基于pandas DataFrame多条件规则新增列计算疫苗第二剂接种日期
pandas多条件动态生成疫苗第二剂接种日期列的正确实现方式
错误原因
你之前的写法存在两个核心问题:
- 直接整列赋值时,只有符合当前筛选条件的行有计算结果,其余行为空值,后续赋值会直接覆盖整列数据,导致前序疫苗的计算结果丢失
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
相关产品推荐
相关产品推荐

