检查pandas DataFrame中的两行是否具有相同的一组值,无论列顺序如何

时间:2019-05-31 02:51:50

标签: python pandas dataframe

我有两个具有相同索引但列名称不同的数据框。列数相同。我想按索引检查索引: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上帮助我吗?

4 个答案:

答案 0 :(得分:2)

使用tupleset:保留顺序或元组,然后使用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