如何在Pandas多列日期中按行求最值并忽略NaN值?
Pandas按行计算日期字段的最小/最大值(忽略NaN)
我有一个包含5个日期字段的Pandas DataFrame,部分行的日期字段可能全有值,也可能仅含1个有效值。需要按行计算这些日期的最小值或最大值,同时忽略NaN值。不想写函数处理所有非NaN组合,因为效率太低。
示例DataFrame:
AccountID CreatdDate ContactDate GiftDate Sign-up Date 1 5/7/2017 nan 1/1/2018 5/7/2017 2 2/6/2020 2/6/2020 2/6/2020 2/6/2020 3 8/29/2010 4/22/2022 4/22/2022 8/4/2022 4 11/25/2017 nan nan nan 5 4/2/2014 1/6/2012 4/2/2014 nan
期望生成的新列:
AccountID Date 1 5/7/2017 2 2/6/2020 3 8/29/2010 4 11/25/2017 5 1/6/2012
解决方案
1. 转换日期列为datetime类型
原始日期是字符串格式,必须先转为pandas的datetime类型才能正确计算:
import pandas as pd # 假设你的DataFrame名为df,指定所有日期列 date_columns = ['CreatdDate', 'ContactDate', 'GiftDate', 'Sign-up Date'] df[date_columns] = df[date_columns].apply(pd.to_datetime, errors='coerce')
errors='coerce'会把无效日期转为NaT(pandas专属的日期空值),后续计算会自动忽略。
2. 按行计算最小/最大值
直接使用pandas的行级聚合方法,指定axis=1(按行计算)和skipna=True(忽略空值):
- 计算最小值(对应示例需求):
df['Date'] = df[date_columns].min(axis=1, skipna=True)
- 计算最大值:
df['Date'] = df[date_columns].max(axis=1, skipna=True)
3. 提取目标列(可选)
如果只需要AccountID和新生成的Date列,直接筛选即可:
result_df = df[['AccountID', 'Date']].copy() # 可选:把日期转回原字符串格式(如需要) result_df['Date'] = result_df['Date'].dt.strftime('%m/%d/%Y')
内容的提问来源于stack exchange,提问作者adam6912748
相关产品推荐
相关产品推荐

