在python熊猫中删除属于相同距离得分的对

时间:2018-09-07 16:54:33

标签: python pandas dataframe duplicates

我正在编写一个代码来计算一行中每个字符串之间的距离。我的代码运行良好。但是,我现在的问题是过滤结果,例如,我得到了以下结果数据框:

 nodeA    nodeB   distance_score
  0        0            0
  0        1            95
  0        2           105
  1        0            95
  1        1             0
  1        2            128
    ........

我想删除属于同一节点的行之一,例如对于(0,1)和(1,0)对来说,一个条目就足够了。根据我在Matlab上的经验,我可以通过迭代两个循环并将每个循环的元素存储在数组中,然后检查这些数组中是否已经存在并删除它们来做到这一点。但是我不认为这是在python中实现的最佳方法,因为我有大量的数据文件,这样做会花费很多

2 个答案:

答案 0 :(得分:3)

使用np.sortdrop_duplicates

a = df.values.copy()
a[:, :2] = np.sort(a[:, :2], 1)
pd.DataFrame(a, columns=df.columns).drop_duplicates()

np.uniquereturn_index参数一起使用:

idx = np.unique(np.sort(a[:, :2], 1), axis=0, return_index=True)[1]
df.loc[idx]

在此示例中,两者均产生:

   nodeA  nodeB  distance_score
0      0      0               0
1      0      1              95
2      0      2             105
4      1      1               0
5      1      2             128

但是,第一个答案(尽管它将始终返回有效的组合)可能会返回与原始DataFrame不同的行。这是一个示例:

df = pd.DataFrame({'nodeA': [2], 'nodeB': [0], 'distance_score': [100]})

   nodeA  nodeB  distance_score
0      2      0             100

使用np.sort时:

a = df.values.copy()
a[:, :2] = np.sort(a[:, :2], 1)
pd.DataFrame(a, columns=df.columns).drop_duplicates()

   nodeA  nodeB  distance_score
0      0      2             100

使用np.unique时:

idx = np.unique(np.sort(a[:, :2], 1), axis=0, return_index=True)[1]
df.loc[idx]

   nodeA  nodeB  distance_score
0      2      0             100

如您所见,第一种方法将在这种情况下翻转组合的顺序。

答案 1 :(得分:2)

另一种方法是使用两个值的冻结集,然后在groupby中使用它,并获取组中的第一个元素,例如:

df.groupby(df[['nodeA', 'nodeB']].apply(frozenset, axis=1), as_index=False).first()

会给你的:

   nodeA  nodeB  distance_score
0      0      0               0
1      0      1              95
2      0      2             105
3      1      1               0
4      1      2             128