【问题标题】:removing reversed duplicates删除反向重复
【发布时间】:2017-06-09 20:43:04
【问题描述】:

我的数据框如下所示:

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 中有描述的解决方案,但我必须保留此列。

【问题讨论】:

    标签: python python-3.x pandas duplicates


    【解决方案1】:

    您可以将sortedapply 一起用于列表colsdrop_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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-05-10
      • 1970-01-01
      • 2020-02-23
      • 1970-01-01
      • 2017-05-01
      • 1970-01-01
      • 2013-05-24
      相关资源
      最近更新 更多