在 Pandas 数据框中创建一个包含布尔列组合计数的方阵

Create a square matrix with combinatorial counts of boolean columns in a Pandas dataframe

我有一个 Pandas 数据框,其中包含许多长列的布尔值。

    Col1    Col2    Col3
0   False   True    True
1   False   True    True
2   False   True    True
3   False   True    False
4   True    False   True

我可以在每个成对的列组合上使用 GroupBy 来获取计数,但我希望有一种更优雅的方法来对列进行成对比较并将结果放入 table (correlation/coincidence矩阵)以便于理解。明确地说,如果相关的两列都为真,我想计算条件。我不太关心身份条目(即 Col1 与自身),但在我的示例中,我刚刚对该列的 True 条件进行了计数。

        Col1    Col2    Col3    
Col1     1       0       1
Col2     0       4       3  
Col3     1       3       4  

您可以使用 numpy。使用逻辑 and (&) as 运算符将数组与自身进行比较:

a = df.values
(a.T[:, None]&a.T).sum(axis=2)

输出:

array([[1, 0, 1],
       [0, 4, 3],
       [1, 3, 4]])

作为数据框:

pd.DataFrame((a.T[:, None]&a.T).sum(2),
             columns=df.columns,
             index=df.columns)

输出:

      Col1  Col2  Col3
Col1     1     0     1
Col2     0     4     3
Col3     1     3     4

答案细分:

>>> a.T
array([[False, False, False, False,  True],
       [ True,  True,  True,  True, False],
       [ True,  True,  True, False,  True]])

>>> a.T[:, None]  ## note the extra dimension
array([[[False, False, False, False,  True]],

       [[ True,  True,  True,  True, False]],

       [[ True,  True,  True, False,  True]]])

>>> (a.T[:, None]&a.T)
array([[[False, False, False, False,  True],
        [False, False, False, False, False],
        [False, False, False, False,  True]],

       [[False, False, False, False, False],
        [ True,  True,  True,  True, False],
        [ True,  True,  True, False, False]],

       [[False, False, False, False,  True],
        [ True,  True,  True, False, False],
        [ True,  True,  True, False,  True]]])

>>> (a.T[:, None]&a.T).sum(2)  ## counts the True in the third dimension
array([[1, 0, 1],
       [0, 4, 3],
       [1, 3, 4]])