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

assert_frame_equal校验同数据DataFrame报错,值一致仍提示不同

解决两个DataFrame对比时的列差异问题

针对你遇到的assert_frame_equal报错(显示列值一致但仍提示差异),可以按以下步骤排查和解决:

1. 精准核对列的底层数据类型

SQLite返回的列类型可能和你手动转换的存在细微差异,比如:

  • SQLite的整数可能是np.int32,而你转成了np.int64
  • 其中一个列是可空整数类型(pd.Int64Dtype(),大写I),另一个是普通整数类型

执行以下代码查看具体类型:

print("DF1 engines dtype:", df1['engines'].dtype)
print("DF2 engines dtype:", df2['engines'].dtype)

如果类型不一致,强制对齐为DF1的类型:

df2['engines'] = df2['engines'].astype(df1['engines'].dtype)

2. 检查缺失值的表示差异

SQLite中的NULL在pandas中会被解析为pd.NA,而直接读取CSV时缺失值可能是np.nan,两者显示相同但底层类型不同。可以统一缺失值格式:

# 将DF2的缺失值转为pd.NA,对齐SQLite的结果
df2['engines'] = df2['engines'].replace(np.nan, pd.NA)

3. 重置索引后再对比

如果两个DataFrame的索引类型或结构存在细微差异(比如一个是RangeIndex,一个是普通整数索引),也会触发断言失败。先重置索引:

df1 = df1.reset_index(drop=True)
df2 = df2.reset_index(drop=True)

4. 逐元素定位差异点

直接用assert_frame_equal无法定位具体问题时,手动对比列的每个元素:

# 找出值不相等的位置
mask = df1['engines'] != df2['engines']
print("DF1差异值:", df1['engines'][mask])
print("DF2差异值:", df2['engines'][mask])

# 检查元素类型差异
for val1, val2 in zip(df1['engines'], df2['engines']):
    if type(val1) != type(val2):
        print(f"类型不匹配: {type(val1)} vs {type(val2)},值为{val1}和{val2}")

5. 调整断言的严格参数

如果以上步骤都无效,尝试更宽松的参数组合:

from pandas.testing import assert_frame_equal

assert_frame_equal(df1, df2, 
                   check_dtype=False,
                   check_index_type=False,
                   check_column_type=False,
                   check_like=True)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 10:55:18