在熊猫交换后,如果列值相同,则删除重复项

时间:2019-03-22 11:41:00

标签: python pandas

假设我具有以下数据框:

df = pd.DataFrame({'name':['john','mary','peter','jeff','bill'], 'matched_name':['mary','john','jeff','lisa','jose'], 'ratio':[78, 78, 22, 19, 45]})
print(df)
    name   matched_name  ratio
0   john      mary        78
1   mary      john        78
2  peter      jeff        22
3   jeff      lisa        19
4   bill      jose        45

我想根据条件删除重复的行:如果交换它们的单元格位置后的列namematched的值相同,并且ratio也相同,则将这些行视为重复的行

根据上述规则,row 0row 1是重复项,因此我将仅保留row 0。我该如何使用熊猫?谢谢。

这是预期的结果:

    name matched  ratio
0   john    mary     78
1  peter    jeff     22
2   jeff    lisa     19
3   bill    jose     45

2 个答案:

答案 0 :(得分:3)

使用np.sort对每行的值进行排序,添加列ratio并按DataFrame.duplicated测试重复项,最后按~boolean indexing按反掩码过滤:

m = (pd.DataFrame(np.sort(df[['name', 'matched_name']], axis=1), index=df.index)
       .assign(ratio=df['ratio'])
       .duplicated())

df = df[~m]
print (df)
    name matched_name  ratio
0   john         mary     78
2  peter         jeff     22
3   jeff         lisa     19
4   bill         jose     45

答案 1 :(得分:2)

请尝试以下操作:

m=pd.DataFrame(np.sort(df.astype(str).values,axis=1)).drop_duplicates().index
df=df.loc[df.index.isin(m)].reset_index()
print(df)

   index   name matched_name  ratio
0      0   john         mary     78
1      2  peter         jeff     22
2      3   jeff         lisa     19
3      4   bill         jose     45