Pandas 合并并仅保留不匹配的记录

mis*_*ded 5 python merge dataframe pandas

如何仅在“id”上合并/连接这两个数据框。生成 3 个新数据框:

  • 1)R1 = 合并记录
  • 2)R2 = (DF1 - 合并记录)
  • 3)R3 = (DF2 - 合并记录)

在 Python 中使用pandas

第一个数据帧 (DF1)

|        id | name  |
|-----------|-------|
| 1         | Mark  |
| 2         | Dart  |
| 3         | Julia |
| 4         | Oolia |
| 5         | Talia |
Run Code Online (Sandbox Code Playgroud)

第二个数据帧 (DF2)

|        id | salary |
|-----------|--------|
| 1         | 20     |
| 2         | 30     |
| 3         | 40     |
| 4         | 50     |
| 6         | 33     |
| 7         | 23     |
| 8         | 24     |
| 9         | 28     |
Run Code Online (Sandbox Code Playgroud)

我的解决方案

R1 =pd.merge(DF1, DF2, on='id', how='inner')
Run Code Online (Sandbox Code Playgroud)

我不确定这是获得 R2 和 R3 的最简单方法

R2 应该看起来像

|        id | name  |
|-----------|-------|
| 5         | Talia |
Run Code Online (Sandbox Code Playgroud)

R3 应该是这样的:

|        id | salary |
|-----------|--------|
| 6         | 33     |
| 7         | 23     |
| 8         | 24     |
| 9         | 28     |
Run Code Online (Sandbox Code Playgroud)

Qua*_*ang 12

您可以打开indicatormerge查找相应的值:

total_merge = df1.merge(df2, on='id', how='outer', indicator=True)

R1 = total_merge[total_merge['_merge']=='both']
R2 = total_merge[total_merge['_merge']=='left_only']
R3 = total_merge[total_merge['_merge']=='right_only']
Run Code Online (Sandbox Code Playgroud)

更新:本的建议是这样的:

dfs = {k:v for k,v in total_merge.groupby('_merge')}
Run Code Online (Sandbox Code Playgroud)

然后你可以这样做,例如:

dfs['both']
Run Code Online (Sandbox Code Playgroud)