如何在Pandas中根据年龄字段插补近似出生日期
出生日期缺失值插补方案
完全可以实现你描述的插补逻辑,且更推荐使用pandas向量化操作替代逐行遍历,执行效率更高,具体实现步骤如下:
步骤1:定义基准日期
先将基准更新日期转为pandas datetime格式,方便后续日期运算:
import pandas as pd last_updated_date = pd.to_datetime("2021-05-31")
步骤2:针对DOB为空的行做定向插补
有两种常用的插补逻辑,可根据你的需求选择:
方案A:按平均年长度计算近似出生日期
直接用时间差计算,pandas会按每年平均365.25天做换算,得到的是粗略出生日期:
df.loc[df['DOB'].isna(), 'DOB'] = last_updated_date - pd.to_timedelta(df.loc[df['DOB'].isna(), 'AGE_YEARS'], unit='Y')
方案B:保留基准日月日,仅减去年龄对应的年份
如果希望插补的出生日期月日和基准日一致,结果更规整,可以用下面的写法:
df.loc[df['DOB'].isna(), 'DOB'] = df.loc[df['DOB'].isna()].apply( lambda x: last_updated_date.replace(year=last_updated_date.year - int(x['AGE_YEARS'])), axis=1 )
插补后的结果示例
以你给出的测试数据为例,id=02的行插补后结果如下:
| id | DOB | AGE_YEARS |
|---|---|---|
| 01 | 1992-06-10 | 29 |
| 03 | 1991-01-10 | 30 |
| 02 | 2016-05-31 | 5 |
补充说明
不推荐手动逐行遍历DataFrame(比如用iterrows()、for循环遍历行)处理:当数据量超过1万条时,逐行操作的性能会比上述向量化操作低几十到上百倍,优先使用pandas内置的批量操作方法即可。
内容的提问来源于stack exchange,提问作者Mazil_tov998
相关产品推荐
相关产品推荐

