首页 > 解决方案 > Pandas 数据框相等性测试

问题描述

只要两个数据帧中的行相等,我如何编写一个检查两个输入数据帧是否相等的函数?所以它忽略了索引位置和列顺序。我不能使用 df.equals() 因为它会强制数据类型相等,这不是我需要的。

from io import StringIO

canonical_in_csv = """,c,a,b
2,hat,x,1
0,rat,y,4
3,cat,x,2
1,bat,x,2"""

with StringIO(canonical_in_csv) as fp:
    df1 = pd.read_csv(fp, index_col=0)

canonical_soln_csv = """,a,b,c
0,x,1,hat
1,x,2,bat
2,x,2,cat
3,y,4,rat"""

with StringIO(canonical_soln_csv) as fp:
    df2 = pd.read_csv(fp, index_col=0)

df1:

    c   a   b
2   hat x   1
0   rat y   4
3   cat x   2
1   bat x   2

df2:

    a   b   c
0   x   1   hat
1   x   2   bat
2   x   2   cat
3   y   4   rat

我的尝试:

temp1 = (df == df2).all()
temp2 = temp1.all()
temp2

ValueError:只能比较标记相同的 DataFrame 对象

标签: pythonpandasdataframe

解决方案


您可以sort_index先使用按索引和列值,然后merge使用eq( ==) 或equals

df11 = df1.sort_index().sort_index(axis=1)
df22 = df2.sort_index().sort_index(axis=1)

print (df11.merge(df22))
   a  b    c
0  y  4  rat
1  x  2  bat
2  x  1  hat
3  x  2  cat

print (df11.merge(df22).eq(df11))
      a     b     c
0  True  True  True
1  True  True  True
2  True  True  True
3  True  True  True

a = df11.merge(df22).eq(df11).values.all()
#alternative
#a = df11.merge(df22).equals(df11)
print (a)
True

你的函数应该被重写:

def checkequality(A, B):

    df11 = A.sort_index(axis=1)
    df11 = df11.sort_values(df11.columns.tolist()).reset_index(drop=True)

    df22 = B.sort_index(axis=1)
    df22 = df22.sort_values(df22.columns.tolist()).reset_index(drop=True)
    return (df11 == df22).values.all()

a = checkequality(df1, df2)
print (a)
True

推荐阅读