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

gwg*_*gwg 6 python pandas

我有两个Pandas DataFrames,我想比较一下.例如

    a    b    c
A   na   na  na
B   na   1    1
C   na   1    na
Run Code Online (Sandbox Code Playgroud)

    a    b    c
A   1    na   1
B   na   na   na
C   na   1    na
D   na   1    na
Run Code Online (Sandbox Code Playgroud)

我希望在这种情况下找到共享的任何值的索引列坐标

    b
C   1
Run Code Online (Sandbox Code Playgroud)

这可能吗?

max*_*moo 5

如果您将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
Run Code Online (Sandbox Code Playgroud)

由于底层数组现在具有相同的形状,您现在可以使用==广播比较并将其用作掩码以返回所有匹配值:

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
Run Code Online (Sandbox Code Playgroud)

如果您的 'na' 值实际上为零,您可以使用稀疏矩阵将其减少到匹配值的坐标(尽管您会丢失索引和列名):

import scipy.sparse as sp
print(sp.coo_matrix(m.where(m.notnull(),0)))
  (2, 1)    1.0
Run Code Online (Sandbox Code Playgroud)