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

基于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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 23:32:57