我有一个比较两个数据帧的函数,如果相等则返回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的解决方案中,代码可以工作,但是如果观察结果相同,我怎么忽略每个表中的行完全相同?
答案 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
属性以查看它们是否完全相同。在这种情况下,他们不是。