我尝试将一些数据从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内部的实现是正确的(没有研究代码本身内部的实现,但是导出和重新导入应该是标准的接口测试用例)。那我在做什么错了?
答案 0 :(得分:2)
我认为df1.equals(df2)
返回False
,因为它考虑了DataFrame
dtype
。 df1
应具有int32
列,而df2
应具有int64
列(您可以使用info()
方法进行验证)。
您可以按照以下说明指定df2
dtype
,以使dtype
与df1
相同:
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)
。