删除反向重复

时间:2017-06-09 11:04:55

标签: python python-3.x pandas duplicates

我的数据框如下所示:

df_in = pd.DataFrame(data={'mol1':['cpd1','cpd2', 'cpd3'], 'mol2': ['cpd2','cpd1', 'cpd4'], 'sim': [0.8,0.8,0.9]})

print(df_in)

   mol1  mol2  sim
0  cpd1  cpd2  0.8
1  cpd2  cpd1  0.8
2  cpd3  cpd4  0.9

对(cpd1,cpd2)出现两次,尽管每个元素不属于同一列。

我想摆脱这些重复,以此结束:

df_out = pd.DataFrame(data={'mol1':['cpd1', 'cpd3'], 'mol2': ['cpd2', 'cpd4'], 'sim': [0.8,0.9]})

print(df_out)

   mol1  mol2  sim
0  cpd1  cpd2  0.8
1  cpd3  cpd4  0.9

如果我忽略第三列,Pythonic way of removing reversed duplicates in list中有一个解决方案,但我必须保留此列。

1 个答案:

答案 0 :(得分:3)

您可以将sortedapply一起用于列表cols中的列,然后drop_duplicates

cols = ['mol1','mol2']
df[cols] = df[cols].apply(sorted, axis=1)
df = df.drop_duplicates()
print (df)
   mol1  mol2  sim
0  cpd1  cpd2  0.8
2  cpd3  cpd4  0.9

numpy.sort类似的解决方案:

cols = ['mol1','mol2']
df[cols] = np.sort(df[cols].values, axis=1)
df = df.drop_duplicates()
print (df)
   mol1  mol2  sim
0  cpd1  cpd2  0.8
2  cpd3  cpd4  0.9

如果需要仅在cols添加参数subset中检查重复项:

df = pd.DataFrame(
{'mol1':['cpd1','cpd2', 'cpd3'], 
'mol2': ['cpd2', 'cpd1', 'cpd4'], 
'sim': [0.7,0.8,0.9]})
print (df)
   mol1  mol2  sim
0  cpd1  cpd2  0.7
1  cpd2  cpd1  0.8
2  cpd3  cpd4  0.9

cols = ['mol1','mol2']
df[cols] = np.sort(df[cols].values, axis=1)
df = df.drop_duplicates(subset=cols)
print (df)
   mol1  mol2  sim
0  cpd1  cpd2  0.7
2  cpd3  cpd4  0.9
相关问题