我正在编写一个代码来计算一行中每个字符串之间的距离。我的代码运行良好。但是,我现在的问题是过滤我的结果,例如我有以下结果数据框:
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中实现它的优化方法,因为我有一个巨大的数据文件,这样做会花费很多
另一种方法是使用两个值的冻结集,然后在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.sort
and drop_duplicates
a = df.values.copy()
a[:, :2] = np.sort(a[:, :2], 1)
pd.DataFrame(a, columns=df.columns).drop_duplicates()
np.unique
with the return_index
parameter: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
正如您所看到的,在这种情况下,第一种方法将颠倒组合的顺序。