删除python中属于相同距离分数的对

2024-04-24 11:18:19 发布

您现在位置:Python中文网/ 问答频道 /正文

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

 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中优化的方法,因为我有大量的数据文件,这样做会花费很多


Tags: 数据字符串代码元素距离节点条目数组
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

使用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

但是,第一个答案(尽管它总是返回有效的组合)可能返回与原始数据帧不同的行。举个例子:

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

如您所见,在本例中,第一种方法将翻转组合顺序。你知道吗

相关问题 更多 >