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
相关产品推荐
相关产品推荐

