计算 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
我有一个包含多个布尔列的 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