如何基于指定列对DataFrame df1与df2执行左连接(left join)
在Pandas中用左连接关联两个DataFrame的具体方法
嗨,我来帮你把这个左连接操作讲得明明白白~ 你提到想用df1.merge(df2, how='left')实现左连接,但因为两个DataFrame的关联列名不一样(df1是user_id,df2是id),直接这么写的话Pandas找不到匹配的关联键,要么报错,要么得到不符合预期的结果,所以得明确指定关联的列才行。
核心逻辑先理清楚
左连接的核心是保留左表(也就是df1)的所有行,然后匹配右表(df2)中对应的数据;如果右表没有找到匹配的记录,对应列就会填充为NaN。
正确的代码写法
你需要用left_on参数指定df1的关联列,right_on参数指定df2的关联列,完整代码如下:
merged_df = df1.merge(df2, how='left', left_on='user_id', right_on='id')
参数解释:
how='left':明确告诉Pandas这是左连接,以df1为基准保留所有行left_on='user_id':指定df1中用来关联的列是user_idright_on='id':指定df2中用来关联的列是id
优化小技巧
如果关联后觉得id和user_id列重复冗余,可以删掉其中一列,比如去掉df2的id列:
merged_df = merged_df.drop('id', axis=1)
举个直观的例子
假设你的df1是这样的:
| user_id | username |
|---|---|
| 1 | Alice |
| 2 | Bob |
| 3 | Charlie |
df2是这样的:
| id | age | city |
|---|---|---|
| 1 | 25 | New York |
| 2 | 30 | London |
执行左连接后得到的merged_df会是:
| user_id | username | id | age | city |
|---|---|---|---|---|
| 1 | Alice | 1 | 25 | New York |
| 2 | Bob | 2 | 30 | London |
| 3 | Charlie | NaN | NaN | NaN |
可以看到,Charlie在df2里没有对应的id记录,所以df2的列都填充了NaN,但df1里的所有行都被完整保留了。
注意事项
- 如果
user_id或id列存在重复值,merge会生成笛卡尔积(也就是每一组匹配的组合都会保留),如果不需要这种结果,可以先对重复值做去重处理:df1 = df1.drop_duplicates(subset='user_id') - 确保两个关联列的数据类型一致(比如都是整数或字符串),否则可能出现匹配失败的情况
内容的提问来源于stack exchange,提问作者user10508414
相关产品推荐
相关产品推荐

