计算 pandas 数据框中多个布尔列的成对重叠

Calculating pairwise overlap for multiple boolean columns in pandas dataframe

我有一个包含多个布尔列的 pandas 数据框。我想找到所有这些列之间的成对重叠。重叠应该类似于两列之间重叠的比例,不包括两者都为零的情况。就像 jaccard 分数,但我想排除两个元素都为零的情况。

数据框示例:

import pandas as pd
import numpy as np
np.random.seed(0)
df = pd.DataFrame(np.random.binomial(1, 0.5, size=(100, 5)), columns=list('ABCDE'))
print(df.head())

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

理想情况下,我想要这样的解决方案(来自这个类似的问题):

from sklearn.metrics.pairwise import pairwise_distances
jac_sim = pairwise_distances(df.T, metric = "jaccard")
jac_sim = pd.DataFrame(jac_sim, index=df.columns, columns=df.columns)

只排除两列的两个元素都为 False 的情况。

这样的事情有帮助吗?

df['AB'] = df['A'] + df['B']
vcs = df['AB'].value_counts()
prop = vcs[2] / (vcs[1] + vcs[2]) # Two means overlap, 1 means no overlap

print(prop)

一种选择是使用您的自定义距离函数调用 scipy.spatial.distance.cdist

from scipy.spatial.distance import cdist

def f(a, b):
  both_one = ((a & b) == 1).sum()
  different = (a != b).sum()
  return 1 - different / (different + both_one)

dists = pd.DataFrame(cdist(df.T, df.T, f), index=df.columns, columns=df.columns)
#           A         B         C         D         E
# A  1.000000  0.240000  0.380952  0.391892  0.260274
# B  0.240000  1.000000  0.323944  0.428571  0.320000
# C  0.380952  0.323944  1.000000  0.333333  0.328571
# D  0.391892  0.428571  0.333333  1.000000  0.362500
# E  0.260274  0.320000  0.328571  0.362500  1.000000