Python 找到等价矩阵的C/numpy代码?
我有一个DataFrame,我想生成一个等价矩阵(或者不管它叫什么),其中每个单元格都有一个值,如果df.Col[I]==df.Col[j],那么当!= 以下代码起作用: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
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