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
相关产品推荐
相关产品推荐

