导出和导入的数据框不同,但应该相同

时间:2018-07-26 16:11:48

标签: python pandas dataframe import export-to-csv

我尝试将一些数据从Excel文件导入到pandas DataFrame,将其转换为csv文件并读回(以后需要对导出的csv文件进行进一步的基于文件的处理,因此这是一个必要步骤)。

出于数据完整性的考虑,导出和重新导入的数据应该相同。因此,我比较了不同的DataFrame并遇到了,至少根据熊猫的.equals() function来看,它们是不同的。

我认为这可能是与导出和重新导入数据时的字符串编码有关的问题,因为在文件处理过程中我必须传输char编码等。但是,我能够重现类似的行为,而没有任何与编码有关的问题,如下所示:

git

为什么git告诉DataFrame不同,但是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)) 告诉它们相等?根据{{​​3}},.equals()甚至认为相同位置的all(df1 == df2)是相等的,而.equals()则不应该相等。因此,比较不同的DataFrame与NaN的严格性不及df1 == df2,但是在我提供的示例中返回的结果并不相同。

.equals()df1 == df2认为我不知道哪个标准?我假设pandas内部的实现是正确的(没有研究代码本身内部的实现,但是导出和重新导入应该是标准的接口测试用例)。那我在做什么错了?

2 个答案:

答案 0 :(得分:2)

我认为df1.equals(df2)返回False,因为它考虑了DataFrame dtypedf1应具有int32列,而df2应具有int64列(您可以使用info()方法进行验证)。 您可以按照以下说明指定df2 dtype,以使dtypedf1相同:

df2 = pd.read_csv('foo.csv', dtype=np.int32)

如果dtype相同,则.equals()应该返回True

答案 1 :(得分:0)

使用index=True将数据帧写入.csv格式时;它会添加名称为Unnamed: 0的额外列。这就是.equals()all(df1 == df2)都告诉数据帧不同的原因。但是,如果使用index=False编写.csv,则不会添加额外的列,您将获得与输入dataframe相等的输出.csv。 如果您不关心数据帧索引,则可以在将数据帧写入.csv时设置index=False或在读取csv时使用pd.read_csv('bar.csv').drop(['Unnamed: 0'],axis=1)