[外链图片转存中…(img-lqsnbbbB-1719886562804)]
使用pd.merge()合并
- 类似 MySQL 中表和表直接的合并
- merge与concat的区别在于,merge需要依据某一共同的行或列来进行合并
- 使用pd.merge()合并时,会自动根据两者相同column名称的那一列,作为key来进行合并
- 每一列元素的顺序不要求一致
1. 一对一合并
df1 = pd.DataFrame({
"name":["张三","李四","王五"],
"id":[1,2,3],
"age":[22,33,44],
})
df2 = pd.DataFrame({
"id":[2,3,4],
"sex":["男","女","男"],
"job":["Saler","CEO","Programer"]
})
display(df1,df2)
| name | id | age |
---|
0 | 张三 | 1 | 22 |
---|
1 | 李四 | 2 | 33 |
---|
2 | 王五 | 3 | 44 |
---|
| id | sex | job |
---|
0 | 2 | 男 | Saler |
---|
1 | 3 | 女 | CEO |
---|
2 | 4 | 男 | Programer |
---|
pd.merge(df1,df2)
| name | id | age | sex | job |
---|
0 | 李四 | 2 | 33 | 男 | Saler |
---|
1 | 王五 | 3 | 44 | 女 | CEO |
---|
df1.merge(df2)
| name | id | age | sex | job |
---|
0 | 李四 | 2 | 33 | 男 | Saler |
---|
1 | 王五 | 3 | 44 | 女 | CEO |
---|
2. 多对一合并
df3 = pd.DataFrame({
"name":["张三","李四","王五"],
"id":[1,2,2],
"age":[22,33,44],
})
df4 = pd.DataFrame({
"id":[2,3,4],
"sex":["男","女","男"],
"job":["Saler","CEO","Programer"]
})
display(df1,df2)
| name | id | age |
---|
0 | 张三 | 1 | 22 |
---|
1 | 李四 | 2 | 33 |
---|
2 | 王五 | 3 | 44 |
---|
| id | sex | job |
---|
0 | 2 | 男 | Saler |
---|
1 | 3 | 女 | CEO |
---|
2 | 4 | 男 | Programer |
---|
df3.merge(df4)
| name | id | age | sex | job |
---|
0 | 李四 | 2 | 33 | 男 | Saler |
---|
1 | 王五 | 2 | 44 | 男 | Saler |
---|
3. 多对多合并
df5 = pd.DataFrame({
"name":["张三","李四","王五"],
"id":[1,2,2],
"age":[22,33,44],
})
df6 = pd.DataFrame({
"id":[2,2,4],
"sex":["男","女","男"],
"job":["Saler","CEO","Programer"]
})
display(df5,df6)
| name | id | age |
---|
0 | 张三 | 1 | 22 |
---|
1 | 李四 | 2 | 33 |
---|
2 | 王五 | 2 | 44 |
---|
| id | sex | job |
---|
0 | 2 | 男 | Saler |
---|
1 | 2 | 女 | CEO |
---|
2 | 4 | 男 | Programer |
---|
df5.merge(df6)
| name | id | age | sex | job |
---|
0 | 李四 | 2 | 33 | 男 | Saler |
---|
1 | 李四 | 2 | 33 | 女 | CEO |
---|
2 | 王五 | 2 | 44 | 男 | Saler |
---|
3 | 王五 | 2 | 44 | 女 | CEO |
---|
4. key的规范化
- 使用 on= 显示指定哪一列为key,当2个DataFrame有多列相同时使用
df1 = pd.DataFrame({
"id":[1,2,3],
"name":["张三","李四","王五"],
"age":[22,33,44],
})
df2 = pd.DataFrame({
"id":[2,3,4],
"name":["男","女","男"],
"job":["Saler","CEO","Programer"]
})
display(df1,df2)
| id | name | age |
---|
0 | 1 | 张三 | 22 |
---|
1 | 2 | 李四 | 33 |
---|
2 | 3 | 王五 | 44 |
---|
| id | name | job |
---|
0 | 2 | 男 | Saler |
---|
1 | 3 | 女 | CEO |
---|
2 | 4 | 男 | Programer |
---|
df1.merge(df2,on="id")
| id | name_x | age | name_y | job |
---|
0 | 2 | 李四 | 33 | 男 | Saler |
---|
1 | 3 | 王五 | 44 | 女 | CEO |
---|
- 使用left_on和right_on指定左右两边的列作为key,当左右两边的key都不想等时使用
df1 = pd.DataFrame({
"id":[1,2,3],
"name":["张三","李四","王五"],
"age":[22,33,44],
})
df2 = pd.DataFrame({
"id2":[2,3,4],
"sex":["男","女","男"],
"job":["Saler","CEO","Programer"]
})
display(df1,df2)
| id | name | age |
---|
0 | 1 | 张三 | 22 |
---|
1 | 2 | 李四 | 33 |
---|
2 | 3 | 王五 | 44 |
---|
| id2 | sex | job |
---|
0 | 2 | 男 | Saler |
---|
1 | 3 | 女 | CEO |
---|
2 | 4 | 男 | Programer |
---|
df1.merge(df2,left_on="id",right_on="id2")
| id | name | age | id2 | sex | job |
---|
0 | 2 | 李四 | 33 | 2 | 男 | Saler |
---|
1 | 3 | 王五 | 44 | 3 | 女 | CEO |
---|
- 当左边的列和右边的index相同的时候,使用right_index=True
df1 = pd.DataFrame({
"id":[1,2,3],
"name":["张三","李四","王五"],
"age":[22,33,44],
})
df2 = pd.DataFrame({
"id2":[2,3,4],
"sex":["男","女","男"],
"job":["Saler","CEO","Programer"]
})
display(df1,df2)
| id | name | age |
---|
0 | 1 | 张三 | 22 |
---|
1 | 2 | 李四 | 33 |
---|
2 | 3 | 王五 | 44 |
---|
| id2 | sex | job |
---|
0 | 2 | 男 | Saler |
---|
1 | 3 | 女 | CEO |
---|
2 | 4 | 男 | Programer |
---|
df1.merge(df2,left_index=True,right_index=True)
| id | name | age | id2 | sex | job |
---|
0 | 1 | 张三 | 22 | 2 | 男 | Saler |
---|
1 | 2 | 李四 | 33 | 3 | 女 | CEO |
---|
2 | 3 | 王五 | 44 | 4 | 男 | Programer |
---|
df1.merge(df2,left_index=True,right_on="id2")
| id | name | age | id2 | sex | job |
---|
0 | 3 | 王五 | 44 | 2 | 男 | Saler |
---|
5. 内合并和外合并
df1 = pd.DataFrame({
"id":[1,2,3],
"name":["张三","李四","王五"],
"age":[22,33,44],
})
df2 = pd.DataFrame({
"id":[2,3,4],
"sex":["男","女","男"],
"job":["Saler","CEO","Programer"]
})
display(df1,df2)
| id | name | age |
---|
0 | 1 | 张三 | 22 |
---|
1 | 2 | 李四 | 33 |
---|
2 | 3 | 王五 | 44 |
---|
| id | sex | job |
---|
0 | 2 | 男 | Saler |
---|
1 | 3 | 女 | CEO |
---|
2 | 4 | 男 | Programer |
---|
df1.merge(df2)
| id | name | age | sex | job |
---|
0 | 2 | 李四 | 33 | 男 | Saler |
---|
1 | 3 | 王五 | 44 | 女 | CEO |
---|
df1.merge(df2,how="inner")
| id | name | age | sex | job |
---|
0 | 2 | 李四 | 33 | 男 | Saler |
---|
1 | 3 | 王五 | 44 | 女 | CEO |
---|
df1.merge(df2,how="outer")
| id | name | age | sex | job |
---|
0 | 1 | 张三 | 22.0 | NaN | NaN |
---|
1 | 2 | 李四 | 33.0 | 男 | Saler |
---|
2 | 3 | 王五 | 44.0 | 女 | CEO |
---|
3 | 4 | NaN | NaN | 男 | Programer |
---|
- 左合并:how=“left”,右合并:how=“right”
df1.merge(df2,how="left")
| id | name | age | sex | job |
---|
0 | 1 | 张三 | 22 | NaN | NaN |
---|
1 | 2 | 李四 | 33 | 男 | Saler |
---|
2 | 3 | 王五 | 44 | 女 | CEO |
---|
df1.merge(df2,how="right")
| id | name | age | sex | job |
---|
0 | 2 | 李四 | 33.0 | 男 | Saler |
---|
1 | 3 | 王五 | 44.0 | 女 | CEO |
---|
2 | 4 | NaN | NaN | 男 | Programer |
---|
6. 列冲突的解决
当列冲突时,即有多个列名称相同时,需要使用 on= 来指定哪一列作为key,配合suffixes指定冲突列名
可以使用 suffixes= 自己指定后缀
df1 = pd.DataFrame({
"id":[1,2,3],
"name":["张三","李四","王五"],
"age":[22,33,44],
})
df2 = pd.DataFrame({
"id":[2,3,4],
"name":["男","女","男"],
"job":["Saler","CEO","Programer"]
})
display(df1,df2)
| id | name | age |
---|
0 | 1 | 张三 | 22 |
---|
1 | 2 | 李四 | 33 |
---|
2 | 3 | 王五 | 44 |
---|
| id | name | job |
---|
0 | 2 | 男 | Saler |
---|
1 | 3 | 女 | CEO |
---|
2 | 4 | 男 | Programer |
---|
df1.merge(df2,on="id",suffixes=["_df1","_df2"])
| id | name_df1 | age | name_df2 | job |
---|
0 | 2 | 李四 | 33 | 男 | Saler |
---|
1 | 3 | 王五 | 44 | 女 | CEO |
---|
7. merge合并总结
- 合并有三种现象:一对一,多对一,多对多
- 合并默认会找相同的列名进行合并,如果有多个列名相同,用on来指定
- 如果没有列名相同,但是数据又相同,可以通过left_on,right_on来分别指定要合并的列
- 如果想和index合并,使用left_index,right_index来指定
- 如果多个列相同,合并之后可以通过suffixes来区分
- 还可以通过how来控制合并的结果,默认时内合并,还有外合并outer,左合并left,右合并right