我正在编写一个代码来计算一行中每个字符串之间的距离。我的代码运行良好。但是,我现在的问题是过滤结果,例如,我得到了以下结果数据框:
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中实现的最佳方法,因为我有大量的数据文件,这样做会花费很多
答案 0 :(得分:3)
np.sort
和drop_duplicates
a = df.values.copy()
a[:, :2] = np.sort(a[:, :2], 1)
pd.DataFrame(a, columns=df.columns).drop_duplicates()
np.unique
与return_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