dataframe横向和纵向拼接

本文详细介绍了Pandas库中如何通过merge函数实现数据框的横向(按列)和纵向(按行)拼接,包括不同连接方式(inner, left, right, outer)的应用,并展示了如何处理重复行和非共有列。通过实例演示了如何结合学号进行内连接、左连接、右连接和全连接,以及如何利用concat函数进行数据框的纵向拼接。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

横向拼接

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班级
0Tom200198Tom一班
1Jack200263Jack二班
2Lucy200388Lucy二班
pd.merge(df1,df2,how='left',on='学号')
 姓名_x学号成绩姓名_y班级
0Tom200198Tom一班
1Jack200263Jack二班
2Lucy200388Lucy二班
3Nick2004100NaNNaN

 

pd.merge(df1,df2,how='right',on='学号')
 姓名_x学号成绩姓名_y班级
0Tom200198Tom一班
1Jack200263Jack二班
2Lucy200388Lucy二班
3NaN2005NaNAnny一班
pd.merge(df1,df2,how='outer',on='学号')

 

 姓名_x学号成绩姓名_y班级
0Tom200198Tom一班
1Jack200263Jack二班
2Lucy200388Lucy二班
3Nick2004100NaNNaN
4NaN2005NaNAnny一班

 

pd.merge(df1,df2,how='inner',on=['学号','姓名'])
 姓名学号成绩班级
0Tom200198一班
1Jack200263二班
2Lucy200388二班

纵向拼接 

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需要写成列表形式
 姓名学号成绩
0Tom200198
1Jack200263
2Lucy200388
3Nick2004100
0Hali200699
1Jerry200740
2Nick2004100

 

pd.concat([df3,df4],ignore_index=True)#ignore_index选择True会舍弃原有索引,重新从零开始索引

 

 姓名学号成绩
0Tom200198
1Jack200263
2Lucy200388
3Nick2004100
4Hali200699
5Jerry200740
6Nick2004100

 

  • 重复行

默认不会删除重复行,如果需要删除,可以在拼接之后用drop_duplicates()

pd.concat([df3,df4],ignore_index=True).drop_duplicates()
 姓名学号成绩
0Tom200198
1Jack200263
2Lucy200388
3Nick2004100
4Hali200699
5Jerry200740
  •  非共有列

会保留非公有列,对于没有对应数值会自动填充为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])
 姓名学号数学成绩英语成绩语文成绩
0Tom20019885.0NaN
1Jack20026394.0NaN
2Lucy20038877.0NaN
3Nick200410089.0NaN
0Hali200699NaN79.0
1Jerry200740NaN86.0
2Money2004100NaN91.0
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值