遍历 pandas 矩阵(以数据框的形式)并根据条件更改元素

Loop through a pandas matrix (in the form of a dataframe) and change elements based on conditions

我有一个 Pandas 矩阵形式的数据框,它表示行和列中的元素(人)之间的相似性分数。

|            |     A     |     B     |    C     |
|------------|-----------|---- ------|----------|
|      D     |    0.4    |    0.1    |   0.1    |
|      E     |    0.2    |    0.1    |   0.4    |
|      F     |    0.9    |    0.4    |   0.3    |
|      G     |    0.4    |    0.2    |   0.6    |
|      H     |    0.3    |    0.1    |   0.7    |

此外,我有这些元素的位置标识符列表。

A - London
B - Sydney
C - Paris
D - Paris
E - Delhi
F - London
G - Melbourne
H - Mumbai

我想遍历矩阵,如果两个元素之间的位置相同,则使相似度得分等于 0。在此示例中,我想将 A 和 F 的交集 0.9 以及 D 和 C 的交集 0.1 分别替换为 0。

谢谢!

编辑:

我正在寻找的最终预期输出如下:

|            |     A     |     B     |    C     |
|------------|-----------|---- ------|----------|
|      D     |    0.4    |    0.1    |   0.0    |
|      E     |    0.2    |    0.1    |   0.4    |
|      F     |    0.0    |    0.4    |   0.3    |
|      G     |    0.4    |    0.2    |   0.6    |
|      H     |    0.3    |    0.1    |   0.7    |

为匹配列名称与城市创建了字典。然后是 rename 索引和列并与 numpy 广播进行比较,最后传递掩码到 DataFrame.mask:

d = {'A': 'London', 'B': 'Sydney', 'C': 'Paris', 'D': 'Paris', 
     'E': 'Delhi', 'F': 'London', 'G':'Melbourne','H':'Mumbai'}


df1 = df.rename(index=d, columns=d)
df = df.mask(df1.index.to_numpy()[:, None] == df1.columns.to_numpy(), 0)
print (df)
     A    B    C
D  0.4  0.1  0.0
E  0.2  0.1  0.4
F  0.0  0.4  0.3
G  0.4  0.2  0.6
H  0.3  0.1  0.7

详情:

print (df1)
           London  Sydney  Paris
Paris         0.4     0.1    0.1
Delhi         0.2     0.1    0.4
London        0.9     0.4    0.3
Melbourne     0.4     0.2    0.6
Mumbai        0.3     0.1    0.7

print (df1.index.to_numpy()[:, None] == df1.columns.to_numpy())
[[False False  True]
 [False False False]
 [ True False False]
 [False False False]
 [False False False]]