创建数据框中两列之间的百分比公式



例如,我有这样的数据框架

df = pd.DataFrame({
'A': [True, True, False, True, False],
'B': [False, False, True, True, True],
'C': [False, True, True, True, True],
'D': [False, False, False, True, False],
'E': [False, True, True, False, False]})
A       B       C       D       E
0   True    False   False   False   False
1   True    False   True    False   True
2   False   True    True    False   True
3   True    True    True    True    False
4   False   True    True    False   False

我想创建一个表,计算两个列之间具有True值的子集的百分比,基于这个公式

(x,y) = countIsAllTrue(col_x &col_y)/countIsTrue(col_x)

在这个例子中,输出应该是这样的(我把计算过程放在这里只是为了解释如何使用我谈论的公式)

A       B       C       D       E
A   3/3=1   1/3     2/3     1/3     1/3
B   1/3     3/3=1   3/3     1/3     1/3
C   2/4     3/4     4/4=1   1/4     2/4
D   1/1=1   1/1=1   1/1=1   1/1=1   0/1=0
E   1/2     1/2     2/2=1   0/2=0   2/2=1

谁能帮我应用这个公式?注意:我使用布尔值是因为我认为它比使用1/0更好,并且可以计数或求和为1/0,或者实际上我使用哪个并不重要?

让我们做dotproduct

s = df.astype(int)
(s.T @ s).div(s.sum(), axis=0)

A         B         C         D         E
A  1.000000  0.333333  0.666667  0.333333  0.333333
B  0.333333  1.000000  1.000000  0.333333  0.333333
C  0.500000  0.750000  1.000000  0.250000  0.500000
D  1.000000  1.000000  1.000000  1.000000  0.000000
E  0.500000  0.500000  1.000000  0.000000  1.000000