我有两个具有相同索引但列名称不同的数据框。列数相同。我想按索引检查索引:1)是否具有与列顺序无关的一组相同的值,以及2)关于列顺序是否具有相同的一组值。
ind = ['aaa', 'bbb', 'ccc']
df1 = pd.DataFrame({'old1': ['A','A','A'], 'old2': ['B','B','B'], 'old3': ['C','C','C']}, index=ind)
df2 = pd.DataFrame({'new1': ['A','A','A'], 'new2': ['B','C','B'], 'new3': ['C','B','D']}, index=ind)
这是我需要的输出。
OpX OpY
-------------
aaa True True
bbb False True
ccc False False
有人可以在OpX和OpY上帮助我吗?
答案 0 :(得分:2)
使用tuple
和set
:保留顺序或元组,然后使用set
重新排序
s1=df1.apply(tuple,1)==df2.apply(tuple,1)
s2=df1.apply(set,1)==df2.apply(set,1)
pd.concat([s1,s2],1)
Out[746]:
0 1
aaa True True
bbb False True
ccc False False
由于提到的cs95此处存在问题
s=np.equal(df1.values,df2.values).all(1)
t=np.equal(np.sort(df1.values,1),np.sort(df2.values,1)).all(1)
pd.DataFrame(np.column_stack([s,t]),index=df1.index)
Out[754]:
0 1
aaa True True
bbb False True
ccc False False
答案 1 :(得分:2)
这是一个性能卓越并且可以扩展的解决方案。首先,在索引上对齐DataFrame,以便您可以轻松比较它们。
df3 = df2.set_axis(df1.columns, axis=1, inplace=False)
df4, df5 = df1.align(df3)
对于要求1,只需调用DataFrame.equals
(或仅使用==
op):
u = (df4 == df5).all(axis=1)
u
aaa True
bbb False
ccc False
dtype: bool
需求2稍微复杂一点,沿第一个轴对它们进行排序,然后进行比较。
v = pd.Series((np.sort(df4) == np.sort(df5)).all(axis=1), index=u.index)
v
aaa True
bbb True
ccc False
dtype: bool
连接结果,
pd.concat([u, v], axis=1, keys=['X', 'Y'])
X Y
aaa True True
bbb False True
ccc False False
答案 2 :(得分:0)
对于项目2):
(df1.values == df2.values).all(axis=1)
这将检查数据帧在元素方面的相等性,并在一行中的所有条目均相等时给出True
。
对于第1项),请首先沿每行对值进行排序:
import numpy as np
(np.sort(df1.values, axis=1) == np.sort(df2.values, axis=1)).all(axis=1)
答案 3 :(得分:0)
构造一个新的DataFrame
并检查是否相等:
df3 = pd.DataFrame(index=ind)
df3['OpX'] = (df1.values == df2.values).all(1)
df3['OpY'] = (df1.apply(np.sort, axis=1).values == df2.apply(np.sort, axis=1).values).all(1)
print(df3)
输出:
OpX OpY
aaa True True
bbb False True
ccc False False