删除python pandas中属于相同距离分数的对[重复]

问题描述 投票:2回答:2

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

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

python pandas dataframe duplicates
2个回答
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

3
投票

Using np.sort and drop_duplicates

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

Using 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

正如您所看到的,在这种情况下,第一种方法将颠倒组合的顺序。

© www.soinside.com 2019 - 2024. All rights reserved.