如何在Pandas DataFrame中将3列Datetime值合并为单列,生成包含每行最早日期的新列
解决方案:为DataFrame生成每行最早日期的新列
我来帮你搞定这个问题!首先咱们先明确需求:从每行的三个日期列(DATE_BEGIN、DATE_START、DATE_REGISTERED)中筛选出最早的日期,生成新列ACTUAL_START_DATE,同时自动忽略NaN值。
第一步:构造示例DataFrame
先把你的示例数据转换成可复现的pandas DataFrame,顺便把日期列转为datetime格式:
import pandas as pd import numpy as np data = { 'CLIENT_ID': [1, 2, 3, 4], 'DATE_BEGIN': ['2020-01-01', '2020-01-02', np.nan, '2020-01-01'], 'DATE_START': ['2020-01-01', '2020-02-01', '2020-05-01', '2020-01-02'], 'DATE_REGISTERED': ['2020-01-01', '2020-01-01', '2020-04-01', np.nan] } df = pd.DataFrame(data) # 将日期列转为datetime类型 date_columns = ['DATE_BEGIN', 'DATE_START', 'DATE_REGISTERED'] df[date_columns] = df[date_columns].apply(pd.to_datetime)
第二步:生成ACTUAL_START_DATE列
最直接高效的方法是使用pandas的min()方法,指定按行计算(axis=1),并设置skipna=True忽略空值:
df['ACTUAL_START_DATE'] = df[date_columns].min(axis=1, skipna=True)
运行后你会得到完全符合预期的结果:
| CLIENT_ID | DATE_BEGIN | DATE_START | DATE_REGISTERED | ACTUAL_START_DATE |
|---|---|---|---|---|
| 1 | 2020-01-01 | 2020-01-01 | 2020-01-01 | 2020-01-01 |
| 2 | 2020-01-02 | 2020-02-01 | 2020-01-01 | 2020-01-01 |
| 3 | NaT | 2020-05-01 | 2020-04-01 | 2020-04-01 |
| 4 | 2020-01-01 | 2020-01-02 | NaT | 2020-01-01 |
关于bfill变体的可行性
结论:不能通过bfill的变体实现这个需求
原因很简单:bfill(backward fill)的核心作用是填充缺失值,它会用当前位置后方的非空值来填补NaN,完全不涉及值的大小比较。比如如果我们尝试对日期列按行执行bfill:
df[date_columns].bfill(axis=1)
第三行的DATE_BEGIN会被填充为DATE_START的2020-05-01,但我们需要的是更早的DATE_REGISTERED(2020-04-01),这显然不符合需求。
咱们的需求是聚合每行的非空值并选取最小值,和bfill的填充逻辑完全不匹配,所以min方法才是最适合的解决方案。
内容的提问来源于stack exchange,提问作者Mazil_tov998
相关产品推荐
相关产品推荐

