Попробуйте:
import pandas as pd
df1 = pd.DataFrame({'a':[1,2,3], 'b': [4,5,6], 'c': [7,8,9]})
df2 =pd.DataFrame(df1)
class DfWrap():
def __init__(self, df):
self.df = df
def __eq__(self, df2):
return all(self.df == df2)
dic1 = {'a': DfWrap(df1)}
dic2 = {'a': DfWrap(df2)}
print(dic1 == dic2)
Это выводит True
.Он также должен работать с assert_dict_equal
, если вы оберните свои dataframe
объекты в DfWrap
.
Вот почему это работает:
Вы должны представить, что для сравнения словарей python будет проходить через каждый ключ (рекурсивно) и вызывать __eq__
(или==
) на предметы для сравнения.Проблема в том, что когда вы вызываете __eq__
(или ==
) на dataframe
, он не возвращает bool
.Вместо этого он возвращает другое dataframe
:
import pandas as pd
df1 = pd.DataFrame({'a':[1,2,3], 'b': [4,5,6], 'c': [7,8,9]})
df2 =pd.DataFrame(df1)
df_compare = df1 == df2
print(type(df_compare))
, которое выводит:
<class 'pandas.core.frame.DataFrame'>
Таким образом, вместо этого оболочка делает так, что выполнение df1 == df2
выводит bool
вместоdataframe
:
DfWrap(df1) == DfWrap(df2)
оценивается как True
.
HTH.