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”值实际上是零,可以使用稀疏矩阵将其减少到匹配值的坐标(但会丢失索引和列名):
import scipy.sparse as sp
print(sp.coo_matrix(m.where(m.notnull(),0)))
(2, 1) 1.0
如果将
keys
参数传递给concat
,则结果数据帧的列将由跟踪原始数据帧的多索引组成:由于底层数组现在具有相同的形状,您现在可以使用
==
来广播比较,并将其用作返回所有匹配值的掩码:如果“na”值实际上是零,可以使用稀疏矩阵将其减少到匹配值的坐标(但会丢失索引和列名):
如果您只需要不同的索引,可以执行:
different_indices = [(i,j) for i in range(len((df1 != df2).columns)) for j in range(len(df1 != df2)) if (df1 != df2)[i][j]]
或者,稍微可读一点:
相关问题 更多 >
编程相关推荐