如何合并特定列上的两个 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)
这是我的问题的一个例子:
数据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)