如何对含主键与双日期列的Pandas DataFrame按日期顺序正确排序
如何实现Pandas DataFrame的自定义日期排序?
你遇到的问题很典型——默认的sort_values是按列优先级依次排序,先排date_1非空的行,再处理date_1为空的行并按date_2排序,这就导致两类日期没法混合按时间顺序排列。要实现你想要的效果,核心是先生成一个统一的日期排序依据列,把每行的有效日期(不管是date_1还是date_2)提取出来,再基于这个列排序。
具体实现步骤
- 确保日期列是datetime类型:如果你的
date_1和date_2是字符串格式,先转成datetime,避免字符串排序的错误(比如"2021-11-9"会排在"2021-11-20"前面)。 - 生成临时排序列:用
combine_first方法,优先取date_1的值,date_1为空时取date_2的值,这样每行都有一个唯一的有效日期作为排序键。 - 按主键和临时列排序:完成排序后可以删掉临时列,保持数据整洁。
完整代码示例
import pandas as pd import numpy as np # 构造你的示例DataFrame data = { 'Primary Key': [22, 22, 22, 22], 'date_1': ['2021-11-20', '2021-11-24', np.nan, np.nan], 'date_2': [np.nan, np.nan, '2021-11-23', '2021-11-22'] } df = pd.DataFrame(data) # 转换日期列为datetime类型 df['date_1'] = pd.to_datetime(df['date_1']) df['date_2'] = pd.to_datetime(df['date_2']) # 创建临时排序列:提取每行的有效日期 df['sort_date'] = df['date_1'].combine_first(df['date_2']) # 按主键和临时日期列排序 df.sort_values(['Primary Key', 'sort_date'], inplace=True) # 移除临时列并重置索引(可选) df.drop('sort_date', axis=1, inplace=True) df.reset_index(drop=True, inplace=True) print(df)
运行后就能得到你期望的结果:
Primary Key date_1 date_2 0 22 2021-11-20 NaT 1 22 NaT 2021-11-22 2 22 NaT 2021-11-23 3 22 2021-11-24 NaT
补充说明
如果你的数据中存在某行date_1和date_2都有值的情况,可以根据需求调整临时列的生成逻辑:
- 取较早的日期:
df['sort_date'] = df[['date_1', 'date_2']].min(axis=1) - 取较晚的日期:
df['sort_date'] = df[['date_1', 'date_2']].max(axis=1)
内容的提问来源于stack exchange,提问作者Roshankumar
相关产品推荐
相关产品推荐

