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

Pandas中按规则用其他列填充NaT:新增date4列的技术问询

解决Pandas多条件日期列填充问题

我来帮你搞定这个date4列的填充需求!首先咱们先明确你的规则优先级,其实可以梳理成:

  • 优先用date1(只要它不是NaT)
  • 如果date1是NaT,就用date2(只要它不是NaT)
  • 最后如果前两个都是NaT,就用date3

这个逻辑完全匹配你给出的示例输出,下面给你两种可行的实现方案:

方案1:链式fillna(最简洁)

这个方法利用fillna的链式调用,按优先级依次填充,代码非常简洁:

import pandas as pd
import numpy as np

# 构造你的原始数据
data = {
    'ID': [0, 1, 2, 3, 4],
    'date1': [pd.NaT, pd.NaT, pd.NaT, '2019-12-06', '2019-11-18'],
    'date2': [pd.NaT, '2019-11-10', pd.NaT, '2019-12-05', '2019-11-18'],
    'date3': ['2019-02-28', '2019-04-09', '2019-05-21', '2019-12-27', '2019-12-20']
}
df = pd.DataFrame(data)
# 先转换为日期类型(如果你的数据还没转的话)
df[['date1', 'date2', 'date3']] = df[['date1', 'date2', 'date3']].apply(pd.to_datetime)

# 新增date4列,按优先级填充
df['date4'] = df['date1'].fillna(df['date2']).fillna(df['date3'])

运行后得到的结果完全符合你的目标输出:

ID      date1      date2      date3      date4
0   0        NaT        NaT 2019-02-28 2019-02-28
1   1        NaT 2019-11-10 2019-04-09 2019-11-10
2   2        NaT        NaT 2019-05-21 2019-05-21
3   3 2019-12-06 2019-12-05 2019-12-27 2019-12-06
4   4 2019-11-18 2019-11-18 2019-12-20 2019-11-18

方案2:np.select(适合复杂多条件场景)

如果之后你的规则变得更复杂,用np.select可以更清晰地列出每个条件和对应的值,可读性更强:

# 定义条件列表(注意顺序:优先级高的条件放在前面)
conditions = [
    # 条件1:date1非空 → 用date1
    df['date1'].notna(),
    # 条件2:date2非空 → 用date2
    df['date2'].notna(),
    # 条件3:date1和date2都空 → 用date3
    df[['date1', 'date2']].isna().all(axis=1)
]

# 对应每个条件的值
values = [
    df['date1'],
    df['date2'],
    df['date3']
]

# 生成date4列
df['date4'] = np.select(conditions, values, default=df['date3'])

这个方法和方案1的结果完全一致,但当你有更多复杂条件时,这种方式更容易维护。

内容的提问来源于stack exchange,提问作者Haalanam

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:59:30