例如,我有这样的数据框架
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,或者实际上我使用哪个并不重要?
让我们做dot
product
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