我有一个像下面这样的数据框,想相互比较行。之后,应该计算两列在所有列中的值多为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)
答案 0 :(得分:2)
您可以使用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