为何导出再导入的Pandas DataFrame彼此不相等?技术解析
为什么导出再导入CSV后Pandas DataFrame不相等?
执行代码后df1.equals(df)返回False,核心是两个技术层面的原因:
1. 索引被额外存储为数据列
原DataFrame的默认整数索引,在执行df.to_csv()时会被默认写入CSV的第一列(无列名)。而用pd.read_csv()读取时,这个无列名的第一列会被当成普通数据列,自动命名为Unnamed: 0。这直接导致df1比原df多了一列,结构完全不一致,equals方法会直接判定不相等。
验证代码:
print(df.columns) # 输出: Index(['A', 'B', 'C', 'D'], dtype='object') print(df1.columns) # 输出: Index(['Unnamed: 0', 'A', 'B', 'C', 'D'], dtype='object')
如果要规避这个问题,导出时可以指定不写入索引:df.to_csv('data.csv', index=False),但此时仍可能因为浮点数问题导致不相等。
2. 浮点数精度的不可逆损失
np.random.randn()生成的是64位双精度浮点数,这类数值写入CSV时会被转换成字符串格式存储,默认只保留6位小数(Pandas默认设置)。当从CSV读回时,字符串重新解析为浮点数,但已经丢失了原始数值的高精度部分。
equals方法是逐元素精确比较,哪怕两个浮点数只有1e-8级别的微小差异,也会被判定为不相等。比如原数值是0.123456789,写入CSV后变成0.123457,读回后就和原值不一致了。
验证代码:
# 先处理索引问题后,用近似比较验证 df1 = pd.read_csv('data.csv') df_no_index = df1.drop('Unnamed: 0', axis=1) print(np.allclose(df, df_no_index)) # 输出: True,说明只是精度差异 print(df.equals(df_no_index)) # 输出: False,因为精确比较不通过
内容的提问来源于stack exchange,提问作者arilwan
相关产品推荐
相关产品推荐

