更简洁的pandas/numpy代码来查找等价矩阵?

3
我有一个pandas 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)

这个能不能改进?

3个回答

3
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

抱歉我表达不够清晰。+1/-1只是举例而已。我看到v == v[:,0]正在创建一个掩码... - Robert Mah
m = df.values == df.values[:, 0] sm = pd.DataFrame(None, df.index, df.index).where(m, 5).where(~m, 3) - Robert Mah
@RobertMah 我稍后会更新,但你需要使用 np.where(m, 5, 3)。 - piRSquared

1
#initialize your sm to 1s
sm = pd.DataFrame(columns=df.index, index=df.index, data=1)
#create a mask to indicate equivalence
mask = (np.asarray(df)[:,None]==np.asarray(df)).reshape(5,5)
#set non-equivalent elements to -1
sm = sm.where(mask,-1)
sm
Out[129]: 
   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

如果您检查我的示例结果,您将会发现它与单位矩阵无关。 - Robert Mah
抱歉,一开始没有仔细看到。已经更新了答案。 - Allen Qin

1

这里是一个使用 乘法 的简洁解决方案 -

a = df.values
sm = pd.DataFrame(4*(a[:,0]==a)-1, df.index, df.index)

要使值为-11,请使用2替换4

示例运行 -

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接