如何合并特定列上的两个 DataFrame,但如果它们出现在第二个 DataFrame 中,则只保留第一个 DataFrame 中的行?

How can two DataFrames on specific columns be merged but only keeping the rows from the first DataFrame if they appear in the second?

这是我的问题的一个例子:

数据A

  fname lname  age company
0  Logi     G   24      SV
1  Gary     J   25     IBT

数据B

  fname lname  age   company
0  Logi     G   24        SV
1  Gary     J   25        IV
2  Adam     B   26  Johnston

我想结束

  fname lname  age   company
0  Logi     G   24        SV
1  Gary     J   25        IBT
2  Adam     B   26  Johnston

其中合并数据框的第 1 行来自 数据 A

merge_d = pd.merge(data_a,data_b, how='outer', on=['fname', 'lname', 'age', 'company'])

这是我使用的查询,但我最终得到的是

  fname lname  age   company
0  Logi     G   24        SV
1  Gary     J   25       IBT
2  Gary     J   25        IV
3  Adam     B   26  Johnston

这样行吗?

df = pd.merge(data_a, data_b, on=['fname', 'lname', 'age'], how="outer", indicator=True)
df = df[df['_merge'] == 'right_only']
output = pd.concat([data_a, df])

使用以下代码:

result = data_a.merge(data_b, how='outer', on=['fname', 'lname', 'age'],
    suffixes=['', '_y'])
result.company.update(result.company_y)
result.drop(columns=['company_y'], inplace=True)

结果是:

  fname lname  age   company
0  Logi     G   24        SV
1  Gary     J   25        IV
2  Adam     B   26  Johnston

如果你有更多的非键列

如果您有更多的列(除了您的 3 个连接列),merge 将 导致其他相应的列,带有 _y 后缀。

然后 运行 对这些列进行额外 更新 然后删除所有这些 _y 列。

例如如果你有另一个 email 列,那么在 merge 运行:

之后
result.email.update(result.email_y)    # Additional instruction
# Extend the list of columns to drop
result.drop(columns=['company_y', 'email_y'], inplace=True)