计算熊猫数据帧中联合的交集(Jaccard 索引)

Ahm*_*tin 6 python numpy dataframe pandas scikit-learn

我有一个数据框,如:

animal    ids
cat       1,3,4
dog       1,2,4
hamster   5        
dolphin   3,5
Run Code Online (Sandbox Code Playgroud)

数据框非常大,有超过 8 万行,而 ids 列可能很容易包含超过数千甚至 1 万个逗号分隔的 id。给定行中的 ID 在逗号分隔的字符串中是唯一的。

我想构建一个计算 Jaccard 索引的数据框,即动物列中的每个项目与 ids 列中的每个项目在联合上的交集。

因此,如果我们查看 cat 和 dog,联合为 2(ids 1 和 4),联合为 4(ids 1、2、3、4),因此 Jaccard 的索引为 2/4 = 0.5。拥有这种格式的数据集会很棒:

            cat        dog        hamster    dolphin
cat         1          0.5        0          0.25
dog         0.5        1          0          0
hamster     0          0          1          0.5
dolphin     0.25       0          0.5        1
Run Code Online (Sandbox Code Playgroud)

这意味着使用行索引作为动物的名称,以便我可以快速找到相关的 jaccard 索引,例如:

cat_dog_ji = df_new['cat']['dog']
Run Code Online (Sandbox Code Playgroud)

use*_*203 5

你可以在这里使用str.get_dummies和一些scipy工具。


from scipy.spatial import distance

u = df["ids"].str.get_dummies(",")
j = distance.pdist(u, "jaccard")
k = df["animal"].to_numpy()
pd.DataFrame(1 - distance.squareform(j), index=k, columns=k)
Run Code Online (Sandbox Code Playgroud)
          cat  dog  hamster  dolphin
cat      1.00  0.5      0.0     0.25
dog      0.50  1.0      0.0     0.00
hamster  0.00  0.0      1.0     0.50
dolphin  0.25  0.0      0.5     1.00
Run Code Online (Sandbox Code Playgroud)