dataframe横向和纵向拼接

横向拼接

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

你可能感兴趣的:(python,数据分析)