【发布时间】:2018-07-26 16:11:47
【问题描述】:
我尝试将一些数据从 Excel 文件导入到 pandas DataFrame,将其转换为 csv 文件并将其读回(稍后需要根据导出的 csv 文件进行一些进一步的文件处理,所以这是一个必要的步骤)。
为了数据完整性,导出和重新导入的数据应该相同。所以,我比较了不同的DataFrame,遇到了,这些都不一样,至少根据pandas的@987654321@。
我认为这可能是在导出和重新导入数据时与字符串编码有关的问题,因为我必须在文件处理时传输字符编码等。但是,我能够在没有任何与编码相关的问题的情况下重现类似的行为,如下所示:
import pandas as pd
import numpy as np
# https://stackoverflow.com/a/32752318
df1 = pd.DataFrame(np.random.randint(0, 10, size=(10, 4)), columns=list('ABCD'))
df1.to_csv('foo.csv', index=False)
df2 = pd.read_csv('foo.csv')
df1.to_csv('bar.csv', index=True)
df3 = pd.read_csv('bar.csv')
print(df1.equals(df2), df1.equals(df3), df2.equals(df3))
print(all(df1 == df2))
为什么.equals() 告诉DataFrames 不同,而all(df1 == df2) 告诉它们是相等的?根据docs,.equals() 甚至认为相同位置的NaNs 是相等的,而df1 == df2 不应该。因此,将不同的 DataFrame 与 .equals() 进行比较不如 df1 == df2 严格,但在我提供的示例中不会返回相同的结果。
df1 == df2 和 df1.equals(df2) 认为我不知道哪些标准?我假设,熊猫内部的实现是正确的(没有研究代码本身内部的实现,但导出和重新导入应该是标准的接口测试用例)。那我做错了什么?
【问题讨论】:
标签: python pandas dataframe import export-to-csv