如何找出两个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,会直接返回所有存在差异的元素,同时展示两边的具体值,是最直观的方式:
- 先筛选出仅包含日期类型的列(避免非日期列干扰):
# 获取所有datetime类型的列名 date_cols = df1.select_dtypes(include='datetime64[ns]').columns # 提取两个DataFrame的日期列子集 df1_dates = df1[date_cols] df2_dates = df2[date_cols]
- 执行对比:
diff_details = df1_dates.compare(df2_dates)
返回的diff_details是一个DataFrame,行索引为存在差异的行号,列是多级索引(原列名 + self/other,分别对应df1和df2的值),清晰展示每个差异位置的具体内容。
方法2:用布尔掩码提取差异位置索引
如果只需要获取所有差异元素的(行索引, 列名)元组列表,可通过布尔掩码实现:
同样先提取日期列子集(步骤同方法1)。
生成差异掩码(
True表示对应位置元素不同):
# ~表示取反,eq()判断元素是否相等 diff_mask = ~df1_dates.eq(df2_dates)
- 提取所有差异位置的索引:
# 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
相关产品推荐
相关产品推荐

