创建一个计算关系记录的对称矩阵

我想通过Value基于另一列 ( ID)的列 ( )计算所有可能的成对关系的数量。

示例数据框:

   ID Value
0   1     A
1   1     A
2   1     A
3   1     B
4   1     C
5   2     B
6   2     C
7   2     C

生成示例数据帧:

import pandas as pd
df = pd.DataFrame({'ID'    : {0:  1,  1: 1,   2: 1,   3: 1,   4: 1,   
                              5:  2,  6: 2,   7: 2}, 
                   'Value' : {0: 'A', 1: 'A', 2: 'A', 3: 'B', 4: 'C',
                              5: 'B', 6: 'C', 7: 'C'} 
                   })

应为ID=1和执行成对计数ID=2

可能的成对,其中 ID=1

(A,A), (A,A), (A,B), (A,C),
(A,A), (A,A), (A,B), (A,C),
(A,A), (A,A), (A,B), (A,C),
(B,A), (B,A), (B,A), (B,C),
(C,A), (C,A), (C,A), (C,B),

可能的成对,其中 ID=2

(B,C), (B,C)
(C,B), (C,C)
(C,B), (C,C)

预期数据框:

   A  B  C
A  6  3  3
B  3  0  3
C  3  3  2

我目前得到的(见下面与其他 stackoverflow 问题的关系):

df = pd.merge(df, df, on='ID')
df = pd.crosstab(df['Value_x'], df['Value_y']).rename_axis(None).rename_axis(None, axis=1)
print (df)

错误的输出:

   A  B  C
A  9  3  3
B  3  2  3
C  3  3  5

你可能会发现这个问题主要与对岸有关。我认为我必须专注于合并方来处理提议的场景。但是,到目前为止我无法处理它:(任何建议?提前致谢!

相关问题:
与那个问题有很多相似之处。然而,这个问题可能有一些错误的预期。(A, A) = 0, (B,B) = 0, (C,C) = 0 的情况应为 0,因为基于该问题,它们在两种情况(ID=1 或 ID=2)中都不存在. 如果我们只想计算这些条件 > AB、AC、BA、BC、CA、CB(来自 ID=1)和 BC、CB(来自 ID=2)。另一方面,这里的主要区别在于对角线。

以上是创建一个计算关系记录的对称矩阵的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>