【问题标题】:Exported and imported DataFrames differ but should be the same导出和导入的 DataFrame 不同但应该相同
【发布时间】: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 == df2df1.equals(df2) 认为我不知道哪些标准?我假设,熊猫内部的实现是正确的(没有研究代码本身内部的实现,但导出和重新导入应该是标准的接口测试用例)。那我做错了什么?

【问题讨论】:

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


    【解决方案1】:

    我认为 df1.equals(df2) 返回 False 因为它考虑了 DataFrame dtypedf1 应该有int32 列,而df2 应该有int64 列(您可以使用info() 方法来验证它)。 您可以指定df2 dtype 如下,以便拥有与df1 相同的dtype

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 2017-09-05
        • 1970-01-01
        • 2015-03-27
        • 2018-08-28
        • 1970-01-01
        • 1970-01-01
        • 2017-06-19
        • 2021-03-18
        • 2020-05-22
        相关资源
        最近更新 更多