如何在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_A | DataFrame_B | 位置 | Col_df_A | Col_df_B |
|---|---|---|---|---|
| df1 | df2 | 0,3 | ['Name', 'Telephone'] | ['Nombre', 'Telefono'] |
| df1 | df3 | 0,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
相关产品推荐
相关产品推荐

