4

我有一个看起来像这样的 Pandas 数据框:

Group1    Group2    Sim
 A         A        1.0
 A         B        0.5
 A         C        0.8
 B         B        1.0
 B         A        0.5
 B         C        0.7
 C         C        1.0
 C         A        0.8
 C         B        0.7

Group1Group2列代表两组对,列Sim代表 Jaccard 相似度。

困难在于:成对的 Jaccard 计算导致两个组列中重复对。

因此,例如,跨组列A,B == B,AA,C == C,A; 等等。

我正在努力解决这个问题:如何删除两列中的冗余/反向对?(对更大的真实数据集的计算限制需要去除冗余。)

我期待以下输出:

Group1   Group2   Sim
A        B        0.5
A        C        0.8
B        C        0.7

对此的任何帮助将不胜感激。

谢谢!

4

2 回答 2

2

使用numpy sort对前两列进行逐行排序,获取 Sim计数大于 1 的行,最后删除重复项

df.loc[:, :2] = np.sort(df.filter(like="Group"))

df.loc[df.groupby(["Group1", "Group2"]).Sim.transform("size") > 1].drop_duplicates()


    Group1  Group2  Sim
   1    A      B    0.5
   2    A      C    0.8
   5    B      C    0.7
于 2020-07-09T13:11:56.733 回答
2

不需要任何复杂的东西。借用这个技巧在 SQL 叉积之后获取唯一对,您可以选择当 Group1 < Group2

df[df["Group1"] < df["Group2"]]

导致

  Group1 Group2  Sim
1      A      B  0.5
2      A      C  0.8
5      B      C  0.7

如果您还想包括身份距离,请更改>>=

这将比公认的答案更有效,因为排序很昂贵。

于 2020-07-09T13:42:29.287 回答