Python 在两个不同形状的数据框中查找相同的数据

Python 在两个不同形状的数据框中查找相同的数据,python,pandas,Python,Pandas,我想比较两个熊猫数据帧。比如说 a b c A na na na B na 1 1 C na 1 na 及 在本例中,我希望找到共享的任何值的索引列坐标 b C 1 这是可能的吗?如果将keys参数传递给concat,则生成的数据帧的列将由跟踪原始数据帧的多索引组成: In [1]: c=pd.concat([df,df2],axis=1,keys=['df1','df2']) c Out[1]:

我想比较两个熊猫数据帧。比如说

    a    b    c
A   na   na  na
B   na   1    1
C   na   1    na

在本例中,我希望找到共享的任何值的索引列坐标

    b
C   1

这是可能的吗?

如果将
keys
参数传递给
concat
,则生成的数据帧的列将由跟踪原始数据帧的多索引组成:

In [1]: c=pd.concat([df,df2],axis=1,keys=['df1','df2'])
        c

Out[1]:
   df1           df2
     a    b    c   a   b   c
A   na   na   na   1  na   1
B   na    1    1  na  na  na
C   na    1   na  na   1  na
D  NaN  NaN  NaN  na   1  na
由于基础数组现在具有相同的形状,您现在可以使用
==
广播比较,并将其用作掩码以返回所有匹配值:

In [171]: m=c.df1[c.df1==c.df2];m
Out[171]:
    a   b   c
A NaN NaN NaN
B NaN NaN NaN
C NaN   1 NaN
D NaN NaN NaN
如果“na”值实际上是零,则可以使用稀疏矩阵将其减少到匹配值的坐标(但会丢失索引和列名):


如果您只需要不同的索引,您可以为范围内的i(len((df1!=df2).columns))的j(len(df1!=df2))的If(df1!=df2)[i][j]执行:

或者,稍微可读一点:

m = (df1 != df2)
different_indices = [(i,j) for i in range(len(m.columns)) for j in range(len(m)) if m[i][j]]

回答得很好,但我认为你需要
any
而不是
all
。此外,OP仍然需要找到匹配的专栏。回答很好@lev你是对的,我误解了他的问题,我编辑了我的答案
import scipy.sparse as sp
print(sp.coo_matrix(m.where(m.notnull(),0)))
  (2, 1)    1.0
m = (df1 != df2)
different_indices = [(i,j) for i in range(len(m.columns)) for j in range(len(m)) if m[i][j]]