pandas中内连接两个dataframe时如何保留全部连接键列?
实现内连接同时保留双侧连接键列的方法
使用pd.merge()时,若要保留左右表各自的连接键列,不要直接使用on参数指定公共连接列,改用left_on、right_on分别指定两侧的连接列即可。
实现逻辑
- 直接传
on='xxx'时,pandas会将该列识别为“两侧共享的匹配依据”,自动去重为单列输出,不会保留两份。 - 分别传
left_on、right_on指定两侧的匹配列时,pandas会把这两列识别为需要正常保留的普通列,按照默认规则为同名列追加_x(来源左表)、_y(来源右表)后缀,和你期望的输出结构完全匹配。 - 该写法的内连接匹配逻辑、结果集范围和使用
on参数的版本完全一致,不会改变原有连接效果。
修正后可运行代码
import pandas as pd head = [['nationality', 'BART', 'USA']] body = [['placeOfBirth', 'BART', 'NEWYORK'], ['hasFather', 'BART', 'HOMMER']] head_df = pd.DataFrame(head, columns=['pred', 'subj', 'obj']) body_df = pd.DataFrame(body, columns=['pred', 'subj', 'obj']) # 核心修改:替换原on='subj'的写法,分别指定两侧连接列 joined_df = pd.merge( head_df, body_df, how='inner', left_on='subj', right_on='subj' )
运行输出结果
pred_x subj_x obj_x pred_y subj_y obj_y 0 nationality BART USA placeOfBirth BART NEWYORK 1 nationality BART USA hasFather BART HOMMER
补充说明
- 你原有代码中存在变量笔误:引用的
body1_df未定义,替换为已创建的body_df即可正常运行。 - 如果需要自定义同名列的后缀,可在merge时传入
suffixes=('_left', '_right')参数,替换默认的_x/_y后缀。
内容的提问来源于stack exchange,提问作者Won chul Shin
相关产品推荐
相关产品推荐

