【问题标题】:Comparing OrderDict of DataFrames比较 DataFrame 的 OrderDict
【发布时间】:2018-11-15 16:22:35
【问题描述】:

我遇到了一个比较问题,这是我的代码:

import pandas as pd
from collections import OrderedDict
from pandas.util.testing import assert_frame_equal

df1 = {'one' : pd.Series([1., 2., 3.], index=['a', 'b', 'c']),
     'two' : pd.Series([1., 2., 3., 4.], index=['a', 'b', 'c', 'd']),
    'three' : pd.Series([1., 2., 3., 4., 5.], index=['a', 'b', 'c', 'd','e'])}

df2 = {'one' : pd.Series([1., 2., 3.], index=['a', 'b', 'c']),
     'two' : pd.Series([1., 2., 3., 4.], index=['a', 'b', 'c', 'd']),
    'three' : pd.Series([1., 2., 3., 4., 5.], index=['a', 'b', 'c', 'd','e'])}
od = OrderedDict() 
od['a'] = pd.DataFrame(df1)
od['b'] = pd.DataFrame(df1)
od['c'] = pd.DataFrame(df1)
od['d'] = pd.DataFrame(df1)

od2 = OrderedDict() 
od2['a'] = pd.DataFrame(df2)
od2['b'] = pd.DataFrame(df2)
od2['c'] = pd.DataFrame(df2)
od2['d'] = pd.DataFrame(df2)

test = assert_frame_equal(od, od2)
print(test)

我有 2 个由 pandas DataFrames 组成的 OrderedDict,我想分析 DataFrames 中的单个元素是否相等。

我发现函数 assert_frame_equal 在比较 2 个 DataFrame 时效果很好,但使用 OrderedDict 时会出现此错误:

AssertionError: DataFrame 预期类型类 'pandas.core.frame.DataFrame',找到类 'collections.OrderedDict' 代替

是否有任何解决方案或解决方法?考虑到我必须从 OrderedDict 开始,不幸的是我无法改变它。

在此先感谢您对此问题的任何帮助/提示。

【问题讨论】:

    标签: python-3.x pandas dictionary dataframe compare


    【解决方案1】:

    这样的?

    for df1, df2 in zip(od.values(), od2.values()):
        test = assert_frame_equal(df1, df2)
        print(test)
    

    返回:

    None
    None
    None
    None
    

    另外,您调用的是您最初的OrderedDicts df1,这可能会在以后导致一些混乱。按照惯例,dfDataFrame 的缩写。

    您也可以使用equal,每个What is the difference between `assert_frame_equal` and `equals`

    for df1, df2 in zip(od.values(), od2.values()):
        test = df1.equals(df2)
        print(test)
    

    返回:

    True
    True
    True
    True
    

    【讨论】:

      【解决方案2】:

      看看这是否有帮助。使用zip()

      for ord1, ord2 in zip(od.values(), od2.values()):
      
          print(assert_frame_equal(ord1, ord2))
      
          # or you can also use 
          print(ord1.equals(ord2))
      

      希望对你有帮助

      【讨论】:

      • odod2 中的值是数据帧,所以我认为不需要调用构造函数。 kvkeyvalue 的简写,因此使用 k 来指代 od.values() 可能会让一些人感到困惑。
      • @Evan 我同意你的看法。
      猜你喜欢
      • 2018-10-03
      • 2023-01-11
      • 2020-02-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-27
      • 2018-11-18
      • 2019-08-09
      相关资源
      最近更新 更多