按照列名和观察结果比较数据框

时间:2017-10-07 23:00:08

标签: python pandas dataframe

我有一个比较两个数据帧的函数,如果相等则返回True,如果列名和观察值不相等则返回False

def table_equal(A, B):
    var_names = sorted(A.columns)
    Y = A[var_names].copy()
    Y.sort_values(by=var_names, inplace=True)
    Y.set_index([list(range(0,len(Y)))], inplace=True)

    var_names2 = sorted(B.columns)
    Z = B[var_names2].copy()
    Z.sort_values(by=var_names, inplace=True)
    Z.set_index([list(range(0,len(Y)))], inplace=True)

    if Y.equals(Z):
        return True
    else:
        return False

假设我有一张原始表格(A),我想比较其他表格。

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

我的功能适用于表B的几乎所有排列,除了下表,它给了我True而不是False

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

我的代码是否有一些调整?

跟进问题:

我希望下面的2个表格在同一个变量中具有相同的观察结果。

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

    c   b   a
6   rat 4   w
3   hat 1   x
1   bat 3   z
9   cat 2   y

从piRSquared的解决方案中,代码可以工作,但是如果观察结果相同,我怎么忽略每个表中的行完全相同?

1 个答案:

答案 0 :(得分:2)

<强>问题
清楚:

A.equals(B)

False

<强>解决方案
使用pd.DataFrame.align

重写你的功能......

def table_equal(A, B):
    X, Y = A.align(B)
    return (X.values == Y.values).all()

table_equal(A, B)

False

<强>解释
align将返回两个数据框,其列和索引相同。

A.align(B)

(
       a  b    c
    0  x  1  hat
    1  y  2  cat
    2  z  3  bat
    3  w  4  rat,

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

由于索引是对齐的,我们可以比较values属性以查看它们是否完全相同。在这种情况下,他们不是。