我有一个数据框,如:
animal ids
cat 1,3,4
dog 1,2,4
hamster 5
dolphin 3,5
数据帧非常大,具有超过8万行,并且id列可能轻松包含数千甚至10万个逗号分隔的id。给定行中的ID在逗号分隔的字符串中将是唯一的。
我想构建一个数据框架来计算Jaccard的索引,即动物列中的每个项目在id列上的联合之间的交集。
因此,如果我们看猫和狗,联合是2(id 1和4),联合是4(id 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
这意味着将行索引用作动物的名称,以便我可以快速找到相关的jaccard索引,例如:
cat_dog_ji = df_new['cat']['dog']
答案 0 :(得分: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)
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
答案 1 :(得分:3)
使用:
d = df.assign(key=1, ids=df['ids'].str.split(','))
d = d.merge(d, on='key', suffixes=['', '_r'])
i = [np.intersect1d(*x).size / np.union1d(*x).size for x in zip(d['ids'], d['ids_r'])]
d = pd.crosstab(d['animal'], d['animal_r'], i, aggfunc='first').rename_axis(index=None, columns=None)
详细信息:
使用DataFrame.assign
创建一个临时列key
,并在列ids
上使用Series.str.split
。然后使用DataFrame.merge
将数据框d
与基于自身的列key
合并(本质上是交叉联接)。
print(d)
animal ids key animal_r ids_r
0 cat [1, 3, 4] 1 cat [1, 3, 4]
1 cat [1, 3, 4] 1 dog [1, 2, 4]
2 cat [1, 3, 4] 1 hamster [5]
3 cat [1, 3, 4] 1 dolphin [3, 5]
4 dog [1, 2, 4] 1 cat [1, 3, 4]
5 dog [1, 2, 4] 1 dog [1, 2, 4]
6 dog [1, 2, 4] 1 hamster [5]
7 dog [1, 2, 4] 1 dolphin [3, 5]
8 hamster [5] 1 cat [1, 3, 4]
9 hamster [5] 1 dog [1, 2, 4]
10 hamster [5] 1 hamster [5]
11 hamster [5] 1 dolphin [3, 5]
12 dolphin [3, 5] 1 cat [1, 3, 4]
13 dolphin [3, 5] 1 dog [1, 2, 4]
14 dolphin [3, 5] 1 hamster [5]
15 dolphin [3, 5] 1 dolphin [3, 5]
在列表理解内使用np.interset1d
和np.union1d
来计算Jaccard's
索引。
print(i)
[1.0, 0.5, 0.0, 0.25, 0.5, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.5, 0.25, 0.0, 0.5, 1.0]
最后,我们使用pd.crosstab
创建一个简单的交叉表,以所需的格式获得结果:
print(d)
cat dog dolphin hamster
cat 1.00 0.5 0.25 0.0
dog 0.50 1.0 0.00 0.0
dolphin 0.25 0.0 1.00 0.5
hamster 0.00 0.0 0.50 1.0