import pandas as pd
import numpy as np
df1 = pd.DataFrame([['Tom','2001',98],
['Jack','2002',63],
['Lucy','2003',88],
['Nick','2004',100]],columns=['姓名','学号','成绩'])
df2 = pd.DataFrame([['Tom','2001','一班'],
['Jack','2002','二班'],
['Lucy','2003','二班'],
['Anny','2005','一班']],columns=['姓名','学号','班级'])
重要参数介绍
- how:用来控制连接方式,可选inner(内连接),left(左连接),right(右连接),outer(外连接),默认选项为内连接
- on:指定基于某个共同列或某些共同列进行连接,默认选项为基于所有共同列进行连接
- left_on:如果连接时左右表的列名不一致,就不用on,而是指明左表列和右表列
- right_on:如果连接时左右表的列名不一致,就不用on,而是指明左表列和右表列
- left_index:如果是基于左表的索引,设置为True
- right_index:如果是基于右表的索引,设置为True
left_on可以和right_index一起使用,left_index可以和right_on一起使用
pd.merge(df1,df2,how='inner',on='学号')
姓名_x 学号 成绩 姓名_y 班级 0 Tom 2001 98 Tom 一班 1 Jack 2002 63 Jack 二班 2 Lucy 2003 88 Lucy 二班
pd.merge(df1,df2,how='left',on='学号')
姓名_x 学号 成绩 姓名_y 班级 0 Tom 2001 98 Tom 一班 1 Jack 2002 63 Jack 二班 2 Lucy 2003 88 Lucy 二班 3 Nick 2004 100 NaN NaN
pd.merge(df1,df2,how='right',on='学号')
姓名_x 学号 成绩 姓名_y 班级 0 Tom 2001 98 Tom 一班 1 Jack 2002 63 Jack 二班 2 Lucy 2003 88 Lucy 二班 3 NaN 2005 NaN Anny 一班
pd.merge(df1,df2,how='outer',on='学号')
姓名_x 学号 成绩 姓名_y 班级 0 Tom 2001 98 Tom 一班 1 Jack 2002 63 Jack 二班 2 Lucy 2003 88 Lucy 二班 3 Nick 2004 100 NaN NaN 4 NaN 2005 NaN Anny 一班
pd.merge(df1,df2,how='inner',on=['学号','姓名'])
姓名 学号 成绩 班级 0 Tom 2001 98 一班 1 Jack 2002 63 二班 2 Lucy 2003 88 二班
import pandas as pd
import numpy as np
df3 = pd.DataFrame([['Tom','2001',98],
['Jack','2002',63],
['Lucy','2003',88],
['Nick','2004',100]],columns=['姓名','学号','成绩'])
df4 = pd.DataFrame([['Hali','2006',99],
['Jerry','2007',40],
['Nick','2004',100]],columns=['姓名','学号','成绩'])
pd.concat([df3,df4])#需要拼接在一起的DataFrame需要写成列表形式
姓名 学号 成绩 0 Tom 2001 98 1 Jack 2002 63 2 Lucy 2003 88 3 Nick 2004 100 0 Hali 2006 99 1 Jerry 2007 40 2 Nick 2004 100
pd.concat([df3,df4],ignore_index=True)#ignore_index选择True会舍弃原有索引,重新从零开始索引
姓名 学号 成绩 0 Tom 2001 98 1 Jack 2002 63 2 Lucy 2003 88 3 Nick 2004 100 4 Hali 2006 99 5 Jerry 2007 40 6 Nick 2004 100
默认不会删除重复行,如果需要删除,可以在拼接之后用drop_duplicates()
pd.concat([df3,df4],ignore_index=True).drop_duplicates()
姓名 学号 成绩 0 Tom 2001 98 1 Jack 2002 63 2 Lucy 2003 88 3 Nick 2004 100 4 Hali 2006 99 5 Jerry 2007 40
会保留非公有列,对于没有对应数值会自动填充为Null
df5 = pd.DataFrame([['Tom','2001',98,85],
['Jack','2002',63,94],
['Lucy','2003',88,77],
['Nick','2004',100,89]],columns=['姓名','学号','数学成绩','英语成绩'])
df6 = pd.DataFrame([['Hali','2006',99,79],
['Jerry','2007',40,86],
['Money','2004',100,91]],columns=['姓名','学号','数学成绩','语文成绩'])
pd.concat([df5,df6])
姓名 学号 数学成绩 英语成绩 语文成绩 0 Tom 2001 98 85.0 NaN 1 Jack 2002 63 94.0 NaN 2 Lucy 2003 88 77.0 NaN 3 Nick 2004 100 89.0 NaN 0 Hali 2006 99 NaN 79.0 1 Jerry 2007 40 NaN 86.0 2 Money 2004 100 NaN 91.0