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

如何在Python中对比多个DataFrame的列并返回差异信息?

多DataFrame列名对比的最优实现方案

问题描述

我有多个DataFrame,需要对所有DataFrame的列名进行对比(仅对比列名,无需对比数据),希望返回列不匹配的位置,以及参与对比的两个DataFrame的对应列名。

示例数据

import pandas as pd

df1 = pd.DataFrame(columns=['Name', 'Age', 'Address', 'Telephone'])
df2 = pd.DataFrame(columns=['Nombre', 'Age', 'Address', 'Telefono'])
df3 = pd.DataFrame(columns=['N.', 'A.', 'Address', 'Telephone', 'Email'])
df4 = pd.DataFrame(columns=['Name', 'Age', 'Address', 'Telephone'])

预期输出

DataFrame_ADataFrame_B位置Col_df_ACol_df_B
df1df20,3['Name', 'Telephone']['Nombre', 'Telefono']
df1df30,1,4['Name', 'Age']['N.', 'A.', 'Email']

已有初始代码片段:

from itertools import combinations

dfs_dict = {"df1": df1, "df2": df2, "df3": df3, "df4": df4}

dfs_names = dfs_dict.keys().tolist()

for df1, df2 in combinations(dfs_names, 2):
    ...

完整实现代码

基于初始代码,我们可以通过以下逻辑完成需求:遍历所有DataFrame的两两组合,对比列名的位置匹配情况,收集不匹配的位置和对应列名,最后整理成结构化结果。

import pandas as pd
from itertools import combinations

# 示例DataFrame(可替换为自己的数据集)
df1 = pd.DataFrame(columns=['Name', 'Age', 'Address', 'Telephone'])
df2 = pd.DataFrame(columns=['Nombre', 'Age', 'Address', 'Telefono'])
df3 = pd.DataFrame(columns=['N.', 'A.', 'Address', 'Telephone', 'Email'])
df4 = pd.DataFrame(columns=['Name', 'Age', 'Address', 'Telephone'])

dfs_dict = {"df1": df1, "df2": df2, "df3": df3, "df4": df4}
dfs_names = list(dfs_dict.keys())

# 存储最终结果
result_list = []

for df_a_name, df_b_name in combinations(dfs_names, 2):
    cols_a = list(dfs_dict[df_a_name].columns)
    cols_b = list(dfs_dict[df_b_name].columns)
    
    mismatch_pos = []
    cols_a_mismatch = []
    cols_b_mismatch = []
    
    # 先对比两个列列表的共同长度范围
    min_col_len = min(len(cols_a), len(cols_b))
    for idx in range(min_col_len):
        if cols_a[idx] != cols_b[idx]:
            mismatch_pos.append(idx)
            cols_a_mismatch.append(cols_a[idx])
            cols_b_mismatch.append(cols_b[idx])
    
    # 处理列数不一致的情况,补充多出的列的位置和名称
    if len(cols_a) > len(cols_b):
        for idx in range(min_col_len, len(cols_a)):
            mismatch_pos.append(idx)
            cols_a_mismatch.append(cols_a[idx])
    elif len(cols_b) > len(cols_a):
        for idx in range(min_col_len, len(cols_b)):
            mismatch_pos.append(idx)
            cols_b_mismatch.append(cols_b[idx])
    
    # 仅当存在不匹配时,将结果加入列表
    if mismatch_pos:
        result_list.append({
            "DataFrame_A": df_a_name,
            "DataFrame_B": df_b_name,
            "位置": ",".join(map(str, mismatch_pos)),
            "Col_df_A": str(cols_a_mismatch),
            "Col_df_B": str(cols_b_mismatch)
        })

# 转换为DataFrame格式输出,便于查看和后续处理
result_df = pd.DataFrame(result_list)
print(result_df)

代码说明

  • 使用combinations生成所有两两DataFrame组合,避免重复对比(如不会同时处理df1&df2和df2&df1)
  • 先对比两个列列表的共同长度区间,记录位置和列名不匹配的项
  • 针对列数不一致的场景,补充额外列的位置和名称到结果中
  • 过滤掉完全匹配的组合(如示例中的df1和df4),只保留有不匹配的记录
  • 最终结果转换为DataFrame,结构清晰,支持导出为CSV等格式

内容的提问来源于stack exchange,提问作者matt.aurelio

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 21:54:15