基于DOB日期条件更新DataFrame Age列值的错误排查与修正
问题描述
我有一个包含datetime64[ns]类型DOB列和Object类型Age列的DataFrame,希望将DOB为1900年的垃圾数据对应的Age列值更新为0。尝试了以下两段代码均未得到预期结果,目前所有DOB日期对应的Age都被错误设为0,仅需将DOB属于1900年的行的Age更新为0。
原始DataFrame:
DOB AGE 2004-05-17 18 1900-01-01 141 1900-02-01 135
尝试的代码:
代码1:
df['Age'].mask(df["DOB"]>="01-01-1900" ,'0', inplace=True)
代码2:
df['Age'] = np.where(df["DOB"]>="01-01-1900", 0, df['DOB'])
预期输出:
DOB AGE 2004-05-17 18 1900-01-01 0 1900-02-01 0
错误原因分析
- 代码1的问题:条件
df["DOB"]>="01-01-1900"会匹配所有晚于等于1900年1月1日的日期,包括2004年的有效数据,导致所有行的Age被错误覆盖为0;同时赋值的是字符串'0',虽然Age是Object类型可以兼容,但逻辑条件完全错误。 - 代码2的问题:同样存在条件范围过大的问题,且
np.where的else分支错误地使用了df['DOB'],会把非1900年行的Age替换为日期值,完全不符合需求。
正确解决方案
需要精准筛选出DOB年份为1900的行,再修改对应Age值,以下是两种可靠实现方式:
方法1:通过dt.year直接匹配年份
利用Pandas的datetime属性直接提取年份进行筛选:
# 定位DOB年份为1900的行,将其Age设为0 df.loc[df['DOB'].dt.year == 1900, 'Age'] = 0
方法2:通过日期范围精准匹配1900全年
如果需要严格匹配1900年的所有日期(从1900-01-01到1900-12-31),可以定义日期范围进行筛选:
import pandas as pd # 定义1900年的起始和结束日期 start_1900 = pd.to_datetime('1900-01-01') end_1900 = pd.to_datetime('1900-12-31') # 筛选处于1900年区间内的行,更新Age为0 df.loc[(df['DOB'] >= start_1900) & (df['DOB'] <= end_1900), 'Age'] = 0
这两种方法都能精准定位目标行,仅修改1900年DOB对应的Age为0,保留其他行的原始Age值。
内容的提问来源于stack exchange,提问作者technical
相关产品推荐
相关产品推荐

