@ -1,10 +1,11 @@
# 3.2.4:合并与连接
# 3.2.4:合并与连接
## 相关知识
## 相关知识
`merge()` 可根据一个或者多个键将不同的`DataFrame`连接在一起,类似于`SQL`数据库中的合并操作。
`merge()` 可根据一个或者多个键将不同的`DataFrame`连接在一起,类似于`SQL`数据库中的合并操作。
参数名|说明
参数名|说明
--|---
:-:|:-:
left|拼接左侧DataFrame对象
left|拼接左侧DataFrame对象
right|拼接右侧DataFrame对象
right|拼接右侧DataFrame对象
on|列(名称)连接, 必须在左和右DataFrame对象中存在(找到)。
on|列(名称)连接, 必须在左和右DataFrame对象中存在(找到)。
@ -12,13 +13,14 @@ left_on|左侧DataFrame中的列或索引级别用作键, 可以是列名、索
right_on|右侧DataFrame中的列或索引级别用作键。可以是列名, 索引级名称, 也可以是长度等于DataFrame长度的数组。
right_on|右侧DataFrame中的列或索引级别用作键。可以是列名, 索引级名称, 也可以是长度等于DataFrame长度的数组。
left_index|如果为True, 则使用左侧DataFrame中的索引(行标签)作为其连接键。
left_index|如果为True, 则使用左侧DataFrame中的索引(行标签)作为其连接键。
right_index|与left_index相似
right_index|与left_index相似
how|它可以等于’ left’ , ‘ right’ , ‘ outer’ , ‘ inner’ . 默认inner。inner是取交集, outer取并集。
how|它可以等于left, right, outer, inner. 默认inner。inner是取交集, outer取并集。
sort|sort - 按照字典顺序通过连接键对结果DataFrame进行排序。
sort|按照字典顺序通过连接键对结果DataFrame进行排序。
suffixes|用于追加到重叠列名的末尾。例如, 左右两个DataFrame都有‘ data’ 列,则结果中就会出现‘ data_x’ 和‘ data_y’ .
suffixes|用于追加到重叠列名的末尾。例如, 左右两个DataFrame都有data列, 则结果中就会出现data_x和data_y.
copy|默认总是复制
copy|默认总是复制
---
---
## 数据连接的类型
## 数据连接的类型
- 一对一的连接
- 一对一的连接
```python
```python
@ -27,32 +29,44 @@ df2 = pd.DataFrame({'employee': ['Lisa', 'Bob', 'Jake', 'Sue'], 'hire_date': [20
df3 = pd.merge(df1,df2)
df3 = pd.merge(df1,df2)
df3
df3
```
```
输出:
输出:



- 多对一的连接
- 多对一的连接
```python
```python
df4 = pd.DataFrame({'group': ['Accounting', 'Engineering', 'HR'], 'supervisor': ['Carly', 'Guido', 'Steve']})
df4 = pd.DataFrame({'group': ['Accounting', 'Engineering', 'HR'], 'supervisor': ['Carly', 'Guido', 'Steve']})
pd.merge(df3,df4)
pd.merge(df3,df4)
```
```
输出:
输出:


- 多对多连接
- 多对多连接
```python
```python
df5 = pd.DataFrame({'group': ['Accounting', 'Accounting', 'Engineering', 'Engineering', 'HR', 'HR'], 'skills': ['math', 'spreadsheets', 'coding', 'linux', 'spreadsheets', 'organization']})
df5 = pd.DataFrame({'group': ['Accounting', 'Accounting', 'Engineering', 'Engineering', 'HR', 'HR'], 'skills': ['math', 'spreadsheets', 'coding', 'linux', 'spreadsheets', 'organization']})
pd.merge(df1,df5)
pd.merge(df1,df5)
```
```
输出:
输出:


## merge()的主要参数
## merge()的主要参数
**1. `on` ** 可以是列名字符串或者一个包含多列名称的列表
**1. `on` ** 可以是列名字符串或者一个包含多列名称的列表
```python
```python
pd.merge(df1, df2, on='employee')
pd.merge(df1, df2, on='employee')
```
```
输出:
输出:


*这个参数只能在两个`DataFrame`有共同列名的时候才可以使用。*
*这个参数只能在两个`DataFrame`有共同列名的时候才可以使用。*
**2. `left_on` 与`right_on`参数**
**2. `left_on` 与`right_on`参数**
有时你也需要合并两个列名不同的数据集,例如前面的员工信息表中有一个字段不是`employee`而是`name`。在这种情况下,就可以用`left_on`和`right_on`参数来指定列名。
有时你也需要合并两个列名不同的数据集,例如前面的员工信息表中有一个字段不是`employee`而是`name`。在这种情况下,就可以用`left_on`和`right_on`参数来指定列名。
@ -60,71 +74,94 @@ pd.merge(df1, df2, on='employee')
df3 = pd.DataFrame({'name': ['Bob', 'Jake', 'Lisa', 'Sue'], 'salary': [70000, 80000, 120000, 90000]})
df3 = pd.DataFrame({'name': ['Bob', 'Jake', 'Lisa', 'Sue'], 'salary': [70000, 80000, 120000, 90000]})
dfx = pd.merge(df1,df3,left_on="employee",right_on="name")
dfx = pd.merge(df1,df3,left_on="employee",right_on="name")
```
```
输出:
输出:



**如果出现重复列,但是列名不同时,可以使用`drop`方法将这列去掉**
**如果出现重复列,但是列名不同时,可以使用`drop`方法将这列去掉**
```python
```python
dfx.drop("name",axis=1)
dfx.drop("name",axis=1)
```
```
输出:
输出:


**3. left_index与right_index参数** 用于合并索引
**3. left_index与right_index参数** 用于合并索引
```python
```python
df1a = df1.set_index('employee')
df1a = df1.set_index('employee')
df2a = df2.set_index('employee')
df2a = df2.set_index('employee')
pd.merge(df1a,df2a,left_index=True,right_index=True)
pd.merge(df1a,df2a,left_index=True,right_index=True)
```
```
输出:
输出:


---
---
用`join()`方法也可以实现该功能:
用`join()`方法也可以实现该功能:
```python
```python
df1a.join(df2a)
df1a.join(df2a)
```
```
输出:
输出:


---
---
如果想将索引与列混合使用,那么可以通过结合`left_index`与` right_on`,或者结合`left_on`与`right_index`来实现。
如果想将索引与列混合使用,那么可以通过结合`left_index`与` right_on`,或者结合`left_on`与`right_index`来实现。
```python
```python
pd.merge(df1a, df3, left_index=True, right_on='name')
pd.merge(df1a, df3, left_index=True, right_on='name')
```
```
输出:
输出:


---
---
**4. how参数**
**4. how参数**
`how` 参数默认情况下是`inner`, 也就是取交集。how参数支持的数据连接方式还有`outer`、`left`和`right`。`outer`表示外连接,取并集。
`how` 参数默认情况下是`inner`,也就是取交集。`how`参数支持的数据连接方式还有`outer`、`left`和`right`。`outer`表示外连接,取并集。
```python
```python
df6 = pd.DataFrame({'name': ['Peter', 'Paul', 'Mary'], 'food': ['fish', 'beans', 'bread']}, columns=['name', 'food'])
df6 = pd.DataFrame({'name': ['Peter', 'Paul', 'Mary'], 'food': ['fish', 'beans', 'bread']}, columns=['name', 'food'])
df7 = pd.DataFrame({'name': ['Mary', 'Joseph'], 'drink': ['wine', 'beer']}, columns=['name', 'drink'])
df7 = pd.DataFrame({'name': ['Mary', 'Joseph'], 'drink': ['wine', 'beer']}, columns=['name', 'drink'])
pd.merge(df6, df7, how='outer')
pd.merge(df6, df7, how='outer')
```
```
输出:
输出:


---
---
左连接和右连接返回的结果分别只包含左列和右列。
左连接和右连接返回的结果分别只包含左列和右列。
```python
```python
pd.merge(df6, df7, how='left')
pd.merge(df6, df7, how='left')
```
```
输出:
输出:


**5. suffixes参数**
**5. suffixes参数**
如果输出结果中有两个重复的列名,因此`pd.merge()`函数会自动为它们增加后缀 `_x ` 或 `_y` ,当然也可以通过`suffixes`参数自定义后缀名。
如果输出结果中有两个重复的列名,因此`pd.merge()`函数会自动为它们增加后缀 `_x ` 或 `_y` ,当然也可以通过`suffixes`参数自定义后缀名。
```python
```python
df8 = pd.DataFrame({'name': ['Bob', 'Jake', 'Lisa', 'Sue'], 'rank': [1, 2, 3, 4]})
df8 = pd.DataFrame({'name': ['Bob', 'Jake', 'Lisa', 'Sue'], 'rank': [1, 2, 3, 4]})
df9 = pd.DataFrame({'name': ['Bob', 'Jake', 'Lisa', 'Sue'], 'rank': [3, 1, 4, 2]})
df9 = pd.DataFrame({'name': ['Bob', 'Jake', 'Lisa', 'Sue'], 'rank': [3, 1, 4, 2]})
pd.merge(df8, df9, on="name", suffixes=["_L", "_R"])
pd.merge(df8, df9, on="name", suffixes=["_L", "_R"])
```
```
输出:
输出:


`suffixes` 参数同样适用于任何连接方式,即使有三个及三个以上的重复列名时也同样适用。
`suffixes` 参数同样适用于任何连接方式,即使有三个及三个以上的重复列名时也同样适用。