在两个数据框中查找重复项并从一个数据框中删除这些重复项

10

从事 Python / pandas / 数据框方面的工作

我有这两个数据框:

Dataframe one:

          1          2    3 
 1   Stockholm     100    250
 2   Stockholm     150    376
 3   Stockholm     105    235
 4   Stockholm     109    104
 5   Burnley       145    234
 6   Burnley       100    250

数据框2:

          1          2    3 
 1   Stockholm     100    250
 2   Stockholm     117    128
 3   Stockholm     105    235
 4   Stockholm     100    250
 5   Burnley       145    234
 6   Burnley       100    953

我希望能找到数据框架一和数据框架二中重复的行,并从数据框架一中删除这些重复行。在数据框架二中,你可以找到数据框架一中的第1、3、5行,这将把它们从数据框架一中删除并创建以下内容:
     1           2       3 
1    Stockholm   150     376
2    Stockholm   109     104
3    Burnley     100     250

你能详细解释一下期望的输出吗?我很难理解哪些行符合输出数据框的标准。 - Anurag Wagh
2个回答

11

应用:

df_merge = pd.merge(df1, df2, on=[1,2,3], how='inner')
df1 = df1.append(df_merge) 

df1['Duplicated'] = df1.duplicated(keep=False) # keep=False marks the duplicated row with a True
df_final = df1[~df1['Duplicated']] # selects only rows which are not duplicated.
del df_final['Duplicated'] # delete the indicator column

以下是翻译的结果:

这个想法如下:

  1. 在所有列上执行内部连接
  2. 将内部连接的输出附加到df1
  3. 识别df1中重复的行
  4. 选择df1中未重复的行

每个数字对应于代码中的每一行。


@Tom Benson:能否解释一下你的评论? - Ji Wei
不好意思,这是一个意外 :) ..非常感谢你的回答 - 它完美地起作用了! - Tom Benson

4
一个简短的命令:
df1.merge(df2, indicator=True, how='outer').query('_merge=="left_only"').drop('_merge', axis=1)

输出:

           1    2    3
2  Stockholm  150  376
4  Stockholm  109  104
6    Burnley  100  250

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接