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

如何找出两个Pandas DataFrame中不同截止日期元素的索引?

如何找出两个同格式DataFrame中所有不同截止日期元素的索引?

问题背景

有两个格式完全一致的DataFrame,每行对应一个项目,其中包含多个datetime64[ns]类型的列,代表项目的不同截止日期。以下是单个DataFrame的info()输出:

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 59 entries, 0 to 58
Data columns (total 12 columns):
 #   Column                 Non-Null Count  Dtype         
---  ------                 --------------  -----         
 0   Status                 59 non-null     object        
 1   ID                     44 non-null     object        
 2   Current assignment     59 non-null     object        
 3   P0                     20 non-null     datetime64[ns]
 4   P1                     29 non-null     datetime64[ns]
 5   P2                     30 non-null     datetime64[ns]
 6   IDR                    24 non-null     datetime64[ns]
 7   FDR                    26 non-null     datetime64[ns]
 8   P3                     33 non-null     datetime64[ns]
 9   PPRR                   2 non-null      datetime64[ns]
 10  P4                     34 non-null     datetime64[ns]
 11  P5                     34 non-null     datetime64[ns]
dtypes: datetime64[ns](9), object(3)
memory usage: 5.7+ KB
None

需要找出两个DataFrame中所有截止日期元素不同的位置(行索引+列名)。

最优解决方案

前提说明

假设两个DataFrame分别命名为df1和df2,且二者的行索引完全对齐(每行对应同一个项目)。


方法1:用compare()直接获取差异详情

Pandas的compare()方法专门用于对比同结构DataFrame,会直接返回所有存在差异的元素,同时展示两边的具体值,是最直观的方式:

  1. 先筛选出仅包含日期类型的列(避免非日期列干扰):
# 获取所有datetime类型的列名
date_cols = df1.select_dtypes(include='datetime64[ns]').columns
# 提取两个DataFrame的日期列子集
df1_dates = df1[date_cols]
df2_dates = df2[date_cols]
  1. 执行对比:
diff_details = df1_dates.compare(df2_dates)

返回的diff_details是一个DataFrame,行索引为存在差异的行号,列是多级索引(原列名 + self/other,分别对应df1和df2的值),清晰展示每个差异位置的具体内容。


方法2:用布尔掩码提取差异位置索引

如果只需要获取所有差异元素的(行索引, 列名)元组列表,可通过布尔掩码实现:

  1. 同样先提取日期列子集(步骤同方法1)。

  2. 生成差异掩码(True表示对应位置元素不同):

# ~表示取反,eq()判断元素是否相等
diff_mask = ~df1_dates.eq(df2_dates)
  1. 提取所有差异位置的索引:
# stack()将二维结构转为多级索引的Series,筛选出值为True的项
diff_indices = list(diff_mask.stack()[diff_mask.stack()].index)

最终diff_indices是一个列表,每个元素是(行号, 列名)的元组,比如[(3, 'P0'), (7, 'FDR')]。


特殊情况处理:按项目ID对齐

如果两个DataFrame的行索引未对齐(比如项目顺序不同),需要先通过ID列合并对齐,再进行对比:

# 按ID列合并,保留所有项目
merged = df1.merge(df2, on='ID', suffixes=('_df1', '_df2'), how='outer')

# 遍历每个日期列,对比对应列的差异
for col in date_cols:
    col_df1 = f"{col}_df1"
    col_df2 = f"{col}_df2"
    # 找出当前列中元素不同的行
    diff_rows = merged[~merged[col_df1].eq(merged[col_df2])]['ID']
    print(f"列{col}中存在差异的项目ID:{list(diff_rows)}")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 07:55:00