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

如何判断两个Pandas DataFrame的列(含类型)是否一致(列序无关)

解决方法:比较DataFrame的列名与对应数据类型(顺序无关)

要实现列名集合完全一致、对应列数据类型完全匹配(列顺序不影响结果)的比较,最优方式是利用Pandas的dtypes属性结合排序后进行相等性校验,具体如下:

核心实现代码

import pandas as pd

# 测试数据
df_1 = pd.DataFrame({'a': [1, 2, 3], 'b': [4, 5, 6]})
df_2 = pd.DataFrame({'b': [14,15], 'a': ['12','14']})  # a列类型不匹配
df_3 = pd.DataFrame({'b': [7, 8], 'a': [9, 10]})       # 列名和类型都匹配

# 提取数据类型并按列名排序后比较
result_1_2 = df_1.dtypes.sort_index().equals(df_2.dtypes.sort_index())
result_1_3 = df_1.dtypes.sort_index().equals(df_3.dtypes.sort_index())

print(result_1_2)  # 输出:False(a列类型不同)
print(result_1_3)  # 输出:True(完全匹配)

原理说明

  1. df.dtypes:返回一个Series对象,索引为列名,值为对应列的数据类型,天然关联列名与类型的映射关系。
  2. sort_index():按列名字典序排序,消除两个DataFrame列顺序不同的影响。
  3. equals():严格比较两个Series的索引(列名)和对应值(数据类型),只有当两者完全一致时才返回True。

备选自定义方法(适合需要排查差异的场景)

如果需要明确知道哪些列不匹配,可以用自定义函数逐个校验:

def check_df_columns_match(df_a, df_b):
    # 先校验列名集合是否一致
    if set(df_a.columns) != set(df_b.columns):
        print("列名集合不匹配")
        return False
    # 逐个列校验数据类型
    for col in df_a.columns:
        if df_a[col].dtype != df_b[col].dtype:
            print(f"列 {col} 数据类型不匹配:{df_a[col].dtype} vs {df_b[col].dtype}")
            return False
    return True

check_df_columns_match(df_1, df_2)
# 输出:列 a 数据类型不匹配:int64 vs object

为什么你的原始代码不准确?

你之前的代码仅比较了排序后的列名,没有关联对应列的数据类型,所以即使列类型不同也会返回True,而上面的方法同时校验了列名和类型,结果更准确。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 13:24:55