Python 按列名称和观察值比较数据帧
我有一个函数来比较两个数据帧,如果相等,则返回Python 按列名称和观察值比较数据帧,python,pandas,dataframe,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
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),我想与其他表进行比较
abc
x 1帽子
y 2猫
z 3蝙蝠
W4大鼠
我的函数适用于表B的几乎所有排列,下表除外,下表给出的是True
而不是False
:
acb
x 1帽子
y 2猫
z 3蝙蝠
W4大鼠
我的代码是否需要做一些调整
跟进问题:
我希望下面的两个表在同一变量中具有相同的观察值
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的解决方案来看,代码是有效的,但只要观察值相同,我怎么能忽略每个表中的行完全相同呢?问题
显然: 解决方案
使用 重写你的函数
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
)
由于索引是对齐的,我们可以比较
值
属性,看看它们是否都相同。在这种情况下,它们不是。对于失败的表格比较,您是否尝试打印出Y
和Z
的计算值,以查看它们是否是您认为应该的值?似乎可以采取相同的基本方法来验证哪些中间步骤没有按您的想法进行(最终导致其中一个步骤与您的想法不符)。是否应该将Z.sort\u值(by=var\u name,inplace=True)
设置为Z.sort\u值(by=var\u names2,inplace=True)
?尝试:如果Y.reset\u索引(下降=真)。等于(Z.reset_索引(下降=真))
因为排序不会改变索引,而比较是按索引进行的。它应该是var_names2。感谢您捕捉到这一点。不幸的是,这和Y.set_索引仍然产生错误的结果。在我看来,似乎每一步都是正确的,但出于某种原因,它仍然返回true而不是异常简单的false。谢谢您忽略比较索引和列值['a','b','c']的方法?例如,我不关心表a是否有索引0,1,2,3或6,7,8,9是,使用a.align(b,轴=1)
Ah.因此,添加额外的axis=1违背了我最初打算将此函数用于生产的目的。我不一定关心表A和表B中的行值是否完全相同。我只需要列变量和观察值共享相同的值。我最初决定在我的原始函数中对它们进行排序,因为我想不出更好的方法了。nvm。我将我的解决方案和你的解决方案结合起来,解决了。谢谢
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
)