python - pd.equals() 在将数据帧转换为 CSV 并返回数据帧后返回 false

标签 python pandas csv dataframe

我有一个原始的 pandas 数据框,我们称它为 df。我将数据帧转换为 csv 文件,然后将其转换回 Pandas 数据帧。当我调用 df.equals(new dataframe) 时,它返回 false。我认为一个错误可能是索引可能被关闭,所以我将新数据帧的索引设置为 csv 文件的第一列(这是原始数据帧的索引)但仍然得到相同的结果。

示例代码:

import pandas as pd

df = <stuff here that aggregates other dataframes into one>
file_name = 'test/aggregated_reports.csv'
df.to_csv(file_name)
df2 = pd.read_csv(file_name, index_col=0)
assert df.equals(df2)

我通过再次将 df2 转换为 csv 并比较 2 个 csvs(file_name 和从 df2.to_csv() 创建的 csv)进行了一些手动测试,它们看起来是相同的,所以我' m 假设在将原始数据帧转换为 csv 文件时发生“差异”。但我还是不太明白...

对于可能导致此处“差异”的原因的任何见解,我们将不胜感激!

最佳答案

这可能只是一个舍入误差(我假设您的数据是数字)。如果您将 float 存储为文本,读回它往往会导致轻微错误。请参见下文 - 尝试使用差异而不是 .equals() 来比较数值数据。

import pandas as pd
import numpy as np

df = pd.DataFrame(
    columns=['a', 'b', 'c'],
    index=[0, 1, 2, 3] * 3,
    data=np.random.random((12, 3)))

file_name = 'mydata.csv'
df.to_csv(file_name)
df2 = pd.read_csv(file_name, index_col=0)

print(df.equals(df2))                            # Returns False
print(np.all(np.abs((df - df2) < 10 ** -10)))    # Returns True

要查看的其他一些选项:

compare = (df == df2)      # Dataframe of True/False
compare.all()              # By column, True if all values are equal
compare.count()            # By column, how many values are equal

# Return any rows where there was a difference
df.where(~compare).dropna(how='all')

关于python - pd.equals() 在将数据帧转换为 CSV 并返回数据帧后返回 false,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47522231/

相关文章:

python - 如何在 Linux 中将 Python 2.7 更新为 Python 3?

python - 在 PyQt5 中获取滚动条拇指的大小/宽度?

Python 套接字刷新

python - 在 Python 中解析嵌套 Json 以删除列中的特殊字符

python - 如何通过在单个单元格中删除 NaN 来调整数据框的大小?

java - 对 CSV 文件中的重复项进行分组并根据某些值对数据进行排名

python - 读取 CSV 文件、操作列并将结果附加到新列中。 Python 2.7

python - 如何将字符串列表写入文件并添加换行符?

python - Pandas - 读取 .csv 文件的结尾

javascript - CSV 格式破坏了我替换客户数据的算法