数据框中列之间公共值的热图

Heatmap of common values between columns in dataframe

我有一个 Pandas 数据框 df 有两列,AB 这样 B 中的所有值对于一个值来说都是不同的在 A 中,但 A 中的两个不同值在 B 中可以有重复值。

     A     B
   ABC1   XYZ XYZ 123
   ABC2   XYZ XYZ 123
   ABC1   XYZ XYZ 135
   ABC3   XYZ PQR 123
   ABC2   XYZ PQR 123
   ABC3   XYZ XYZ 135
   ABC4   XYZ XYZ 135
   ABC2   XYZ PQR 987
   ABC4   XYZ PQR 123
   ABC5   PQR PQR 567       

我如何从这个数据框创建一个热图,显示任意两个 A 值之间的公共 B 值的数量?我想我必须创建一个可能看起来像这样的枢轴 -

         ABC1   ABC2   ABC3   ABC4   ABC5 
ABC1      2      1     ...
ABC2      1      3
ABC3      0      1            ...       
ABC4      0      0     ...            ...
ABC5      0      0

关于如何高效完成此操作的任何帮助?

我认为我们可以为此使用 get_dummiesnp.tensordot

首先,让我们找出 A 的每个值存在哪些 B

>>> common = pd.get_dummies(df['A']).groupby(df['B']).max()
>>> common
   Bar  Foo
B          
2    1    0
3    0    1
4    0    1
5    1    1
6    1    0
9    1    0

然后要计算每行的交集,我们需要每对行的点积,为此我们可以使用:

>>> np.tensordot(common, common, (0, 0))
array([[4, 1],
       [1, 3]], dtype=uint8)
>>> pd.DataFrame(np.tensordot(common, common, (0, 0)), columns=common.columns, index=common.columns)
     Bar  Foo
Bar    4    1
Foo    1    3

对角线显示每个 A 列的唯一 B 值的数量。