pandas-数据合并merge()

概述

本文讲解按照 指定的 列 合并数据

类似关系型数据库的多表关联查询,左外查询、右外查询

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

原文出处:/show_1EF3AuKaSoPj.html