首页 > 解决方案 > 比较列中相同值的行并生成矩阵

问题描述

我有一个像下面这样的数据框,想比较彼此之间的行。之后,它应该计算两行在所有列中的值 1 的频率。

object |A|B|C|D|E
101     1 1 1 1 1
102     1 0 1 0 0
103     0 1 0 1 1

我想看到的(我放了 NaN 因为将同一行与自身进行比较没有意义)。

   101 | 102 | 103
101 NaN   2     3
102 2   NaN     0
103 3     0     NaN

现在我只这样做,但这仅适用于列,而不是行:

data=pd.DataFrame()#dummy
matrix=data.T.dot(data.T)

标签: pythonpandasnumpy

解决方案


你可以检查dot

s=df.iloc[:,1:].values
s.dot(s.T)
Out[308]: 
array([[5, 2, 3],
       [2, 2, 0],
       [3, 0, 3]], dtype=int64)

然后我们重新创建数据框

newdf=pd.DataFrame(s.dot(s.T),index=df.object,columns=df.object)
newdf=newdf.astype(float)
newdf.values[[np.arange(len(newdf))]*2]=np.nan # mask the diagonal to nan
newdf
Out[312]: 
object  101  102  103
object               
101     NaN  2.0  3.0
102     2.0  NaN  0.0
103     3.0  0.0  NaN

推荐阅读