约定第一行代码
import pandas as pd
Merge-数据库风格的合并
pd.merge(left, right, how='inner', on=None, left_on=None, right_on=None, left_index=False,right_index=False, sort=False, suffixes=('_x', '_y'), copy=True, indicator=False, validate=None)
各参数的含义
left、right:左右连接对象
how:连接方式,共有’inner’,’left’,right’,’outer’
on:根据连接的键
left_on、right_on:在连接的键名不同的情况下使用,left_on传入左对象的键,right_on传入右对象的键
left_index、right_index:设置索引是否作为连接的键,通常 left_on=??和right_index=True, right_on=??和left_index=True,或者left_index=True和right_index=True
sort:对连接后的结果是否排序,当数据巨大的时候为了追求效率可以设置为False
suffixes:对于不作为键的同名列,在其列名后添加的后缀
copy:将左右对象的内容复制过来,默认为True
各个用法的例子
创建连接的左右对象
df1=pd.DataFrame({'名字':list('ABCDE'),'性别':['男','女','男','男','女'],'职称':['副教授','讲师','助教','教授','助教']},index=range(1001,1006))
df1.columns.name='学院老师'
df1.index.name='编号'
df1
代码结果
学院老师 | 名字 | 性别 | 职教 |
---|---|---|---|
编号 | |||
1001 | A | 男 | 副教授 |
1002 | B | 女 | 讲师 |
1003 | C | 男 | 助教 |
1004 | D | 男 | 教授 |
1005 | E | 女 | 助教 |
df2=pd.DataFrame({'名字':list('ABDAX'),'课程':['C++','计算机导论','汇编','数据结构','马克思原理'],'职称':['副教授','讲师','教授','副教授','讲师']},index=[1001,1002,1004,1001,3001])
df2.columns.name='课程'
df2.index.name='编号'
df2
代码结果
学院老师 | 名字 | 职教 | 课程 |
---|---|---|---|
编号 | |||
1001 | A | 副教授 | C++ |
1002 | B | 讲师 | 计算机导论 |
1003 | D | 教授 | 汇编 |
1004 | A | 副教授 | 数据结构 |
3001 | X | 讲师 | 马克思原理 |
1默认连接方式
pd.merge(df1,df2)
代码结果
名字 | 性别 | 职称 | 课程 | |
---|---|---|---|---|
0 | A | 男 | 副教授 | C++ |
1 | A | 男 | 副教授 | 数据结构 |
2 | B | 女 | 讲师 | 计算机导论 |
3 | D | 男 | 教授 | 汇编 |
2指定列名合并
pd.merge(df1,df2,on='名字')
代码结果
名字 | 性别 | 职称_x | 职称_y | 课程 | |
---|---|---|---|---|---|
0 | A | 男 | 副教授 | 副教授 | C++ |
1 | A | 男 | 副教授 | 副教授 | 数据结构 |
2 | B | 女 | 讲师 | 讲师 | 计算机导论 |
3 | D | 男 | 教授 | 教授 | 汇编 |
3其他连接方式:left/right/outer
left
pd.merge(df1,df2,how='left')
代码结果
名字 | 性别 | 职称 | 课程 | |
---|---|---|---|---|
0 | A | 男 | 副教授 | C++ |
1 | A | 男 | 副教授 | 数据结构 |
2 | B | 女 | 讲师 | 计算机导论 |
3 | C | 男 | 助教 | NaN |
4 | D | 男 | 教授 | 汇编 |
5 | E | 女 | 助教 | NaN |
right
pd.merge(df1,df2,how='right')
代码结果
名字 | 性别 | 职称 | 课程 | |
---|---|---|---|---|
0 | A | 男 | 副教授 | C++ |
1 | A | 男 | 副教授 | 数据结构 |
2 | B | 女 | 讲师 | 计算机导论 |
3 | D | 男 | 教授 | 汇编 |
4 | X | NaN | 讲师 | 马克思原理 |
outer
pd.merge(df1,df2,how='outer')
代码结果
名字 | 性别 | 职称 | 课程 | |
---|---|---|---|---|
0 | A | 男 | 副教授 | C++ |
1 | A | 男 | 副教授 | 数据结构 |
2 | B | 女 | 讲师 | 计算机导论 |
3 | C | 男 | 助教 | NaN |
4 | D | 男 | 教授 | 汇编 |
5 | E | 女 | 助教 | NaN |
6 | X | NaN | 讲师 | 马克思原理 |
4根据多个键进行连接
pd.merge(df1,df2,on=['职称','名字'])
代码结果
名字 | 性别 | 职称_x | 职称_y | 课程 | |
---|---|---|---|---|---|
0 | A | 男 | 副教授 | 副教授 | C++ |
1 | A | 男 | 副教授 | 副教授 | 数据结构 |
2 | B | 女 | 讲师 | 讲师 | 计算机导论 |
3 | D | 男 | 教授 | 教授 | 汇编 |
5对重复的列名处理
pd.merge(df1,df2,on='名字',suffixes=('_1','_2'))
代码结果
名字 | 性别 | 职称_1 | 职称_2 | 课程 | |
---|---|---|---|---|---|
0 | A | 男 | 副教授 | 副教授 | C++ |
1 | A | 男 | 副教授 | 副教授 | 数据结构 |
2 | B | 女 | 讲师 | 讲师 | 计算机导论 |
3 | D | 男 | 教授 | 教授 | 汇编 |
6 将索引作为连接的键
当我们连接时,无论是左右对象的索引都会被丢弃的。当们需要将索引作为连接键时可以如下方式
pd.merge(df1,df2,on=['名字','职称'],left_index=True,right_index=True)
代码结果
名字 | 性别 | 职称 | 课程 | |
---|---|---|---|---|
1001 | A | 男 | 副教授 | C++ |
1001 | A | 男 | 副教授 | 数据结构 |
1002 | B | 女 | 讲师 | 计算机导论 |
1004 | D | 男 | 教授 | 汇编 |