【问题标题】:AssertionError when comparing pd DataFrame比较 pd DataFrame 时出现 AssertionError
【发布时间】:2020-07-03 21:10:06
【问题描述】:

我正在为我创建的函数开发测试。我的函数返回一个 pandas DataFrame,我的测试包括将它与存储的 csv 文件进行比较。我正在使用以下脚本来执行此操作。当我运行它时,我得到AssertionError,没有其他消息。

rates_over = get_rates_over(args)
gabarito = pd.read_csv(f'{ROOT_DIR}/data/static/rates_over_teste.csv', parse_dates=['date'])
assert rates_over.equals(gabarito)

但是我怀疑我的功能是好的,所以我做了以下并且它没有打印任何东西,表明我的直觉是正确的。发生了什么?

for index, row in gabarito.iterrows():
    if not row.equals(rates_over.iloc[index]):
        print('Not equal!')

编辑:正如@gallen 所建议的,这里是gabaritoRates_over 的类型和头部的打印。

【问题讨论】:

  • 您能否提供来自gabaritorates_over 的每个数据的小样本?

标签: python pandas assertion


【解决方案1】:

DataFrame从不等于 Series。

pd.DataFrame.equals

此功能允许将两个 Series 或 DataFrame 相互比较,以查看它们是否具有相同的形状和元素。

它旨在比较 DataFrame 与 DataFrame,或 Series 与 Series,而不是 Series 与 DataFrame 的混合。

Series 和 DataFrame 具有完全不同的维度。

import pandas as pd

df = pd.DataFrame({'foo': [1,2,3]})
s = df['foo']

print(df.shape)
#(3, 1)
print(s.shape)
#(3,)

equals 方法中的第一个检查是检查维度,因此它很快返回 False,而无需检查数据。

def equals(self, other):
    self_axes, other_axes = self.axes, other.axes
    if len(self_axes) != len(other_axes):
        return False
    #...


len(s._data.axes)
#1
len(df._data.axes)
#2

如果您确定您的 DataFrame 只有一列,那么您可以在与您的系列进行比较之前squeeze 它。

df.squeeze().equals(s)
#True

或者使用系列名称将您的系列转换为 DataFrame。

df.equals(s.to_frame(s.name))
#True

【讨论】:

  • 我已将您的答案标记为有用,但这并不是我要问的。我修正了标题,以便其他人也不会误解。我添加了一个打印,显示比较的两个元素都是数据框。
  • 我明白了。我的猜测是浮点数不准确。您可以尝试使用 numpy.is_close
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-06
  • 1970-01-01
  • 2020-04-22
  • 1970-01-01
相关资源
最近更新 更多