pd.merge()函数的使用(Python数据科学手册)

1.merge函数的构成

merge(left, right, how='inner', on=None, left_on=None, right_on=None, left_index=False, right_index=False, sort=True, suffixes=('_x','_y'), copy=True, indicator=False)
                             

2.merge函数的参数

left:参与合并的左侧的dataframe

right:参与合并的右侧的dataframe

how:连接方式

on:用于连接的列索引的名称,必须存在于左右的两个dataframe中,如果没有指定其他的 且其他的参数也没有指定,则以两个dataframe列名交集作为连接键

left_on:左侧dataframe中用于连接键的列名,这个参数左右列各不同但含义相同时非常有用

right_on:右侧的dataframe中用于连接的列名

left_index:使用左侧dataframe的行索引作为连接键

right_index:使用右侧dataframe的行索引作为连接键

sort:默认为True,将合并的数据进行排序,设置为false可以提高性能

suffixes:字符串值组成的元组,用于指定当左右dataframe存在相同列名时在后面附加的后缀名

3.merge函数的使用

1、数据连接的类型

一对一连接,多对一连接,多对多连接

代码实例

一对一

from cv2 import merge
import pandas as pd

df1 = pd.DataFrame({'employee': ['Bob', 'jake', 'lisa', 'Sue'],
                   'groups': ['Accounting', 'Engineering', 'Engineering', 'HR']})

df2 = pd.DataFrame({'employee': ['lisa', 'Bob', 'jake', 'Sue'],
                    'hire_date': [2004, 2008, 2012, 2014]})
print(df1)
print(df2)

print(pd.merge(df1, df2))

 多对一

from cv2 import merge
import pandas as pd

df1 = pd.DataFrame({'employee': ['Bob', 'jake', 'lisa', 'Sue'],
                   'group': ['Accounting', 'Engineering', 'Engineering', 'HR']})

df2 = pd.DataFrame({'employee': ['lisa', 'Bob', 'jake', 'Sue'],
                    'hire_date': [2004, 2008, 2012, 2014]})
# print(df1)
# print(df2)

df3 = pd.merge(df1, df2)

print(df3)

df4 = pd.DataFrame({'group': ['According', 'Engineering', 'HR'],
                    'supervisor': ['Carly', 'Guido', 'Steve']})

print(df4)

print(pd.merge(df3, df4))

多对多

 

from cv2 import merge
import pandas as pd

df1 = pd.DataFrame({'employee': ['Bob', 'jake', 'lisa', 'Sue'],
                   'group': ['Accounting', 'Engineering', 'Engineering', 'HR']})

df2 = pd.DataFrame({'employee': ['lisa', 'Bob', 'jake', 'Sue'],
                    'hire_date': [2004, 2008, 2012, 2014]})
print(df1)
# print(df2)

df3 = pd.merge(df1, df2)

# print(df3)

df4 = pd.DataFrame({'group': ['According', 'Engineering', 'HR'],
                    'supervisor': ['Carly', 'Guido', 'Steve']})

# print(df4)

df5 = pd.DataFrame({'group': ['Accounting', 'Accounting', 'Engineering', 'Engineering', 'HR', 'HR'],
                    'skills': ['math', 'spreadsheets', 'coding', 'linux', 'spreadsheets', 'organization']})

print(df5)

print(pd.merge(df1, df5))

2、设置数据合并的键

on参数的用法,最简单的方法就是直接将参数on设置为一个列名字符串或者一个包含列名称的列表,这个参数只能在两个dataframe有共同列名时才可以使用

3、left_on与right_on参数

合并两个列名不同的数据框

会获取很多列,有多余的列用dataframe中的drop函数删除

4、left_index与right_index参数

除了合并列以外,还需要合并列的索引

5、设置数据连接的集合操作规则

内连接:结果中只包含两个输入集合的交集

外连接:返回两个输入的列的并集,所有的缺失值用NaN填充

左连接和右连接:返回的结果分别只包含左列与右列

6、重复列名(suffixes)

输入datafram有重复列名的情况

代码比较简单,就不放代码在这里了

 

<think>好的,用户现在想详细了解pandas中的pd.merge函数,包括使用指南和参数详解。我之前已经回复过关于df.index.repeat的问题,现在需要根据用户的新请求调整内容。用户还提供了三个引用,但看起来这些引用主要讨论pd.merge用法,可能来自之前的对话或资料。不过用户提到这些引用仅供参考,需要结合他们上一次的问题和我的回答来处理。 首先,我需要回顾用户的上一个问题,即关于df.index.repeat的详细解析。那个问题涉及到数据复制和索引操作,现在用户转向数据合并,这可能是因为他们在处理数据时需要整合不同的数据集。用户可能正在处理多个数据源,需要合并数据,所以需要深入理解pd.merge的参数和用法。 接下来,我需要组织pd.merge的详细指南。用户希望参数详解和使用示例,所以我应该按照逻辑顺序介绍每个参数,并给出示例说明。同时,结合用户提供的引用内容,尤其是引用[3]中的参数列表,我需要确保覆盖所有参数,并解释清楚每个的作用。 需要注意的是,用户可能在合并数据时遇到常见问题,比如键的选择、合并方式(inner、outer、left、right)、处理重复列名等。我应该强调这些常见问题,并提供解决方案,比如使用on参数指定键,或使用suffixes处理后缀。 另外,用户可能对pd.mergepd.concat的区别有疑问,虽然他们现在只问了merge,但适当比较可以帮助他们更好地选择合适的方法。不过根据引用[2],用户可能已经知道这一点,所以可以简要提及,但重点还是放在merge上。 还要考虑用户的实际应用场景,比如多键合并、处理索引合并等,给出相应的示例。例如,使用left_index和right_index参数在索引上进行合并,或者处理多对多关系时的注意事项。 最后,要确保回答结构清晰,分点说明,参数部分用表格展示可能更直观,代码示例要正确且易于理解。同时,生成的相关问题需要与pd.merge相关,帮助用户进一步探索可能遇到的问题,比如性能优化、处理冲突或合并后的数据验证等。</think>以下是基于Pandas官方文档和实际应用总结的`pd.merge()`函数深度解析: --- ### 一、核心功能定位 `pd.merge()`是Pandas实现**数据库风格合并**的核心方法,支持基于列/索引的关联操作,适用于处理关系型数据连接需求,相当于SQL的`JOIN`操作[^1][^2]。 --- ### 二、参数详解与使用场景 #### 基础参数 | 参数 | 类型 | 默认值 | 作用 | 示例场景 | |------|------|--------|------|----------| | `left` | DataFrame | - | 左数据集 | 客户信息表 | | `right` | DataFrame | - | 右数据集 | 订单记录表 | | `on` | str/list | None | 连接键列名 | `on='user_id'` | | `left_on` | str/list | None | 左表连接键 | 左表键为`client_id`时使用 | | `right_on` | str/list | None | 右表连接键 | 右表键为`customer_id`时使用 | | `how` | str | 'inner' | 合并方式 | `how='left'`保留所有左表记录 | #### 高级控制参数 | 参数 | 类型 | 说明 | 典型应用 | |------|------|------|----------| | `left_index` | bool | False | 使用左表索引作为连接键 | 时间序列对齐 | | `right_index` | bool | False | 使用右表索引作为连接键 | 索引值匹配合并 | | `suffixes` | tuple | ('_x','_y') | 列名冲突时的后缀 | `suffixes=('_left','_right')` | | `indicator` | bool/str | False | 添加合并来源标记列 | 调试合并结果时使用 | | `validate` | str | None | 检查合并类型是否合法 | 确保一对一关系时用`'1:1'` | --- ### 三、合并模式(`how`)详解 | 模式 | SQL等价 | 行为 | 适用场景 | |------|---------|------|----------| | `inner` | INNER JOIN | 仅保留键匹配的行 | 精确数据对齐 | | `left` | LEFT JOIN | 保留左表全部记录 | 主从表关联 | | `right` | RIGHT JOIN | 保留右表全部记录 | 逆向主从关联 | | `outer` | FULL OUTER JOIN | 保留所有记录 | 数据完整性检查 | | `cross` | CROSS JOIN | 笛卡尔积 | 组合分析 | --- ### 四、实战示例 #### 1. 基础列合并 ```python left = pd.DataFrame({'key': ['A', 'B', 'C'], 'value': [1, 2, 3]}) right = pd.DataFrame({'key': ['B', 'C', 'D'], 'value': [4, 5, 6]}) # 内连接 pd.merge(left, right, on='key', suffixes=('_left', '_right')) ``` 输出: ``` key value_left value_right 0 B 2 4 1 C 3 5 ``` #### 2. 索引合并 ```python # 左表用索引,右表用列 pd.merge(left, right, left_index=True, right_on='key') ``` #### 3. 多键合并 ```python pd.merge(df1, df2, on=['department', 'year'], how='outer') ``` --- ### 五、关键注意事项 1. **键值匹配** - 默认寻找**列名相同的键**,建议显式指定`on`参数 - 混合使用列和索引时需同时设置`left_on`+`right_index` 2. **重复值处理** - 当键列存在重复值时会产生多对多合并(类似笛卡尔积) - 使用`validate='1:m'`可验证关系类型 3. **性能优化** - 对连接键预先排序可提升速度`df.sort_values(key)` - 大数据集合并优先使用`dask.dataframe` --- ### 六、与`pd.concat()`对比 | 特性 | `pd.merge()` | `pd.concat()` | |------|--------------|---------------| | 合并维度 | 列对齐 | 行/列堆叠 | | 键匹配方式 | 基于列值 | 基于索引/位置 | | 典型场景 | 关系型数据连接 | 数据块拼接 | --- --相关问题--: 1. 如何处理合并后的列名冲突?[^3] 2. 如何实现多对多合并的数据验证?[^4] 3. 合并时出现NaN值应该怎么处理?[^5] 4. 如何提升大规模数据合并的性能?[^6]
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值