Python 找到等价矩阵的C/numpy代码?

Python 找到等价矩阵的C/numpy代码?,python,pandas,numpy,Python,Pandas,Numpy,我有一个DataFrame,我想生成一个等价矩阵(或者不管它叫什么),其中每个单元格都有一个值,如果df.Col[I]==df.Col[j],那么当!= 以下代码起作用: df = pd.DataFrame({"Col":[1, 2, 3, 1, 2]}, index=["A","B","C","D","E"]) df Col A 1 B 2 C 3 D 1 E 2 sm = pd.DataFrame(columns=df.index, index=df.inde

我有一个DataFrame,我想生成一个等价矩阵(或者不管它叫什么),其中每个单元格都有一个值,如果df.Col[I]==df.Col[j],那么当!=

以下代码起作用:

df = pd.DataFrame({"Col":[1, 2, 3, 1, 2]}, index=["A","B","C","D","E"])
df

    Col
A   1
B   2
C   3
D   1
E   2

sm = pd.DataFrame(columns=df.index, index=df.index)
for i in df.index:
    for j in df.index:
        if df.Col[i] == df.Col[j]:
            sm.loc[i, j] = 3
        else:
            sm.loc[i, j] = -1
sm

     A   B   C   D   E
A    3  -1  -1   3  -1
B   -1   3  -1  -1   3
C   -1  -1   3  -1  -1
D    3  -1  -1   3  -1
E   -1   3  -1  -1   3
但一定有更好的办法。也许用numpy?有什么想法吗

[编辑]

用piRsquared写的东西,也许是这样的

m = df.values == df.values[:, 0]
sm = pd.DataFrame(None, df.index, df.index).where(m, 3).where(~m, -1)

这可以改进吗?

这里有一个使用
乘法
的紧凑解决方案-

v = df.values
m = v == v[:, 0]
pd.DataFrame(np.where(m, 1, -1), df.index, df.index)

   A  B  C  D  E
A  1 -1 -1  1 -1
B -1  1 -1 -1  1
C -1 -1  1 -1 -1
D  1 -1 -1  1 -1
E -1  1 -1 -1  1
a = df.values
sm = pd.DataFrame(4*(a[:,0]==a)-1, df.index, df.index)
要使值为
-1
1
,请将
4
替换为
2

样本运行-

In [41]: df
Out[41]: 
   Col
A    1
B    2
C    3
D    1
E    2

In [42]: a = df.values

In [43]: pd.DataFrame(4*(a[:,0] == a)-1, df.index, df.index)
Out[43]: 
   A  B  C  D  E
A  3 -1 -1  3 -1
B -1  3 -1 -1  3
C -1 -1  3 -1 -1
D  3 -1 -1  3 -1
E -1  3 -1 -1  3

对不起,我不清楚。+1/-1只是示例。我看到v==v[:,0]正在创建一个掩码…m=df.values==df.values[:,0]sm=pd.DataFrame(None,df.index,df.index)。where(m,5)。where(~m,3)@RobertMah我稍后会更新,但您需要np。where(m,5,3)如果您检查我示例中的结果,您会发现它与身份矩阵无关。很抱歉,一开始没有仔细查看它。我已经更新了答案。
In [41]: df
Out[41]: 
   Col
A    1
B    2
C    3
D    1
E    2

In [42]: a = df.values

In [43]: pd.DataFrame(4*(a[:,0] == a)-1, df.index, df.index)
Out[43]: 
   A  B  C  D  E
A  3 -1 -1  3 -1
B -1  3 -1 -1  3
C -1 -1  3 -1 -1
D  3 -1 -1  3 -1
E -1  3 -1 -1  3