概述
本文讲解按照 指定的 列 合并数据
类似关系型数据库的多表关联查询,左外查询、右外查询
merge
语法
默认的合并方式:inner,并集
data_frame.merge(data_frame2,on,left_on,right_on,how)
参数
- data_frame2:dataframe对象
- on:列名,表示按照哪一列进行合并
- how:合并方式
- inner:内连接,指定data_frame列的值 与 data_frame2的列的值 相同时才进行合并
- outer:外连接,指定列无论是否相同都合并。不同时,没有的值显示NaN
- left:左连接,以左侧的对象为基础,按照 指定列进行合并,将右侧对象中指定列相同的值合并过来,不同的显示NaN
- right:右连接,以右侧的对象为基础,按照 指定列进行合并,将左侧对象中指定列相同的值合并过来,不同的显示NaN
- left_on:列名,与right_on同时使用,以左侧对象的列的值 和 右侧对象的列的值 相同的,进行合并
- right_on:列名,与 left_on同时使用
返回值
dataframe对象
例子1
指定name列进行合并
import pandas as pd
df1=pd.DataFrame([{'name':'李雷','age':20,'phone':'13700000011'},{'name':'韩梅梅','age':18,'phone':'13800011123'}])
df2=pd.DataFrame([{'name':'韩梅梅','sex':'女','age':18},{'name':'lucy','sex':'女','age':18},{'name':'李雷','sex':'男','age':20}])
df3=df1.merge(df2,on='name')
print(df1)
print(df2)
print('*'*50)
print(df3)
结果如下:
age name phone
0 20 李雷 13700000011
1 18 韩梅梅 13800011123
age name sex
0 18 韩梅梅 女
1 18 lucy 女
2 20 李雷 男
**************************************************
age_x name phone age_y sex
0 20 李雷 13700000011 20 男
1 18 韩梅梅 13800011123 18 女
总结
- 合并后df1和df2都没变化
- 合并后生成新对象,该对象的数据是: df1的name列的值与df2的name列的值 相同时,对应显示
- 当df1和df2有相同列名时,除了指定列以外,在新对象中会改成别名
例子2
指定age列进行合并
import pandas as pd
df1=pd.DataFrame([{'name':'李雷','age':20,'phone':'13700000011'},{'name':'韩梅梅','age':18,'phone':'13800011123'}])
df2=pd.DataFrame([{'name':'韩梅梅','sex':'女','age':18},{'name':'lucy','sex':'女','age':18},{'name':'李雷','sex':'男','age':20}])
df3=df2.merge(df1,on='age')
print(df1)
print(df2)
print('*'*50)
print(df3)
结果如下:
age name phone
0 20 李雷 13700000011
1 18 韩梅梅 13800011123
age name sex
0 18 韩梅梅 女
1 18 lucy 女
2 20 李雷 男
**************************************************
age name_x sex name_y phone
0 18 韩梅梅 女 韩梅梅 13800011123
1 18 lucy 女 韩梅梅 13800011123
2 20 李雷 男 李雷 13700000011
总结
- 合并后df1和df2都没变化
- 合并后生成新对象,该对象的数据是: df1的age列的值与df2的age列的值 相同时,对应显示
- df1的18对应 df2两条记录
例子3
外连接
import pandas as pd
df1=pd.DataFrame([{'name':'李雷','age':20,'phone':'13700000011'},{'name':'韩梅梅','age':18,'phone':'13800011123'},{'name':'lili','age':20,'phone':'13800011123'}])
df2=pd.DataFrame([{'name':'韩梅梅','sex':'女','age':18},{'name':'lucy','sex':'女','age':18},{'name':'李雷','sex':'男','age':20}])
df3=df2.merge(df1,on='name',how='outer')
print(df1)
print(df2)
print('*'*50)
print(df3)
结果如下:
age name phone
0 20 李雷 13700000011
1 18 韩梅梅 13800011123
2 20 lili 13800011123
age name sex
0 18 韩梅梅 女
1 18 lucy 女
2 20 李雷 男
**************************************************
age_x name sex age_y phone
0 18.0 韩梅梅 女 18.0 13800011123
1 18.0 lucy 女 NaN NaN
2 20.0 李雷 男 20.0 13700000011
3 NaN lili NaN 20.0 13800011123
总结
- 合并后df1和df2都没变化
- 指定的列,无论是否相同都合并。不同时,没有的值显示NaN
例子4
左外连接
import pandas as pd
df1=pd.DataFrame([{'name':'李雷','age':20,'phone':'13700000011'},{'name':'韩梅梅','age':18,'phone':'13800011123'},{'name':'lili','age':20,'phone':'13800011123'}])
df2=pd.DataFrame([{'name':'韩梅梅','sex':'女','age':18},{'name':'lucy','sex':'女','age':18},{'name':'李雷','sex':'男','age':20}])
df3=df2.merge(df1,on='name',how='left')
print(df1)
print(df2)
print('*'*50)
print(df3)
结果如下:
age name phone
0 20 李雷 13700000011
1 18 韩梅梅 13800011123
2 20 lili 13800011123
age name sex
0 18 韩梅梅 女
1 18 lucy 女
2 20 李雷 男
**************************************************
age_x name sex age_y phone
0 18 韩梅梅 女 18.0 13800011123
1 18 lucy 女 NaN NaN
2 20 李雷 男 20.0 13700000011
总结
- 合并后df1和df2都没变化
- 以左侧对象(df2)为基础,按照name列进行合并,将右侧对象(df1)中name列相同的值合并过来,不同的显示NaN
例子5
右外连接
import pandas as pd
df1=pd.DataFrame([{'name':'李雷','age':20,'phone':'13700000011'},{'name':'韩梅梅','age':18,'phone':'13800011123'},{'name':'lili','age':20,'phone':'13800011123'}])
df2=pd.DataFrame([{'name':'韩梅梅','sex':'女','age':18},{'name':'lucy','sex':'女','age':18},{'name':'李雷','sex':'男','age':20}])
df3=df2.merge(df1,on='name',how='right')
print(df1)
print(df2)
print('*'*50)
print(df3)
结果如下:
age name phone
0 20 李雷 13700000011
1 18 韩梅梅 13800011123
2 20 lili 13800011123
age name sex
0 18 韩梅梅 女
1 18 lucy 女
2 20 李雷 男
**************************************************
age_x name sex age_y phone
0 18.0 韩梅梅 女 18 13800011123
1 20.0 李雷 男 20 13700000011
2 NaN lili NaN 20 13800011123
总结
- 合并后df1和df2都没变化
- 以右侧对象(df1)为基础,按照name列进行合并,将左侧对象(df2)中name列相同的值合并过来,不同的显示NaN
例子6
当两个dateframe对象的列都不同时,通过left_on指定左侧对象的列,right_on指定右侧对象的列
import pandas as pd
df1=pd.DataFrame([{'name':'李雷','age':20,'phone':'13700000011'},{'name':'韩梅梅','age':18,'phone':'13800011123'},{'name':'lili','age':20,'phone':'13800011123'}])
df2=pd.DataFrame([{'姓名':'韩梅梅','sex':'女','age':18},{'姓名':'lucy','sex':'女','age':18},{'姓名':'李雷','sex':'男','age':20}])
df3=df2.merge(df1,left_on='姓名',right_on='name')
print(df1)
print(df2)
print('*'*50)
print(df3)
结果如下:
age name phone
0 20 李雷 13700000011
1 18 韩梅梅 13800011123
2 20 lili 13800011123
age sex 姓名
0 18 女 韩梅梅
1 18 女 lucy
2 20 男 李雷
**************************************************
age_x sex 姓名 age_y name phone
0 18 女 韩梅梅 18 韩梅梅 13800011123
1 20 男 李雷 20 李雷 13700000011

