Pandas合并表格的方法总结

本文详细介绍了Pandas中的数据拼接concat、merge和join方法。concat用于简单粗暴的行或列拼接;merge适用于复杂拼接,支持多种连接方式;join则基于行索引进行列拼接。理解这些方法对于数据处理至关重要。

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

1. concate

df = pandas.concat(objs, axis=0, join='outer', ignore_index=False, 
        keys=None, levels=None, names=None, verify_integrity=False, 
        sort=None, copy=True) 

"""
(1)objs:对象,一般为df或者series
(2)axis:拼接方向,默认为0,行拼接,若axis=1,则为列拼接
(3)join:默认为outer表示并集,inner表示交集, left/right表示左右连接
(4)ignore_index=True:重建索引
(5)keys:创建层次化索引
"""


(1)两张表列数一致,只是需要将行数简单拼接时:pd.concat([df1,df2]),

        效果df1.append(df2)。
(2)两张表行数一致,只需要列简单拼接时:pd.concate([df1,df2],axis=1),

        效果pd.merge(df1,df2,left_index=True,right_index=True,how=‘outer’)。
(3)两张表按行拼接,只想保留列索引相同的列,则how=‘inner’。
(4)两张表按列拼接,只想保留行索引相同的行,则how=‘inner’。

2. merge

df =DataFrame.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)

# innner: 默认的连接方式,共同的列必须完全相等
# left: 根据左边的dataframe确定共同列的保留值,右边缺失列的值赋为NaN
# right: 根据右边的dataframe确定共同列的保留值,左边缺失列的值赋为NaN

# 多列合并
result = pd.merge(df1, df2, on=['B', 'C'], how='inner') 

# 采用left_on 和 right_on对两个列名不同的dataframe合并
result = pd.merge(df1, df2, left_on='A', right_on='D', how='inner')

# 采用suffixes属性为合并的两个dataframe的相同的列设置合并后相同列名的后缀
result = pd.merge(df1, df2, on='B', how='outer', suffixes=('_df1', '_df2'))

(1)merge只能用于两张表的连接,若有多个,则需不断两两合并实现。
(2)两张表有相同内容的一列,根据这一列将两张表进行合并,合并表的列数等于两张数据表列数和减去连接键的数量

#样集1
df1=pd.DataFrame(np.arange(12).reshape(3,4),columns=['a','b','c','d'])
>>> df1
   a  b   c   d
0  0  1   2   3
1  4  5   6   7
2  8  9  10  11
#样集2
df2=pd.DataFrame({'b':[1,5],'d':[3,7],'a':[0,4]})  
>>> df2
   b  d  a
0  1  3  0
1  5  7  4
#两张表df1和df2的列名有重叠,且重叠列的内容完全相同,直接用pd.merge(df1, df2)
pd.merge(df1,df2)  
>>>
    a	b	c	d
0	0	1	2	3
1	4	5	6	7  

3. join

df =DataFrame.join(other, on=None, how='left', 
                   lsuffix=' ', rsuffix=' ', sort=False)
#样集1
left=pd.DataFrame({'key':['foo','bar1'],'lval':[1,2]})
>>>
    key  lval
0   foo     1
1  bar1     2
#样集2
right=pd.DataFrame({'key':['foo','bar'],'rval':[4,5]})
>>>
   key  rval
0  foo     4
1  bar     5
#列名和列内容均部分相同的表df1和df2进行基于列索引,列拼接
left.join(right.set_index('key'),on='key')
>>>
    key	  lval	rval
0	foo  	1	4.0
1	bar1	2	NaN
#样集3
left=pd.DataFrame({'key':['foo','bar1'],'val':[1,2]})
>>>
    key   val
0   foo     1
1   bar1    2
#样集4
right=pd.DataFrame({'key':['foo','bar'],'val':[4,5]})
>>>
   key  val
0  foo    4
1  bar    5
#列名相同,列内容部分相同的表df1和df2基于列索引进行列合并,必须用参数lsuffix='_l',rsuffix='_r'指定重名列的下标,否则报错
left.join(right.set_index('key'),on='key',lsuffix='_l',rsuffix='_r')
>>>
    key	  val_l	 val_r
0	foo	    1	 4.0
1	bar1	2	 NaN
#特别注意,即使列名相同了,也必须用到' set_index(key)' 否则直接使用
left.join(right,on='key',lsuffix='_l',rsuffix='_r')
>>> ValueError: You are trying to merge on object and int64 columns. If you wish to proceed you should use pd.concat
#另外需明确,不指定'ON= '参数的情况下,JOIN是按行索引进行列拼接,不对列进行任何操作。
left.join(right,lsuffix='_l',rsuffix='_r')


(1)无重复列名的两个表基于行索引进行拼接,直接使用df1.join(df2),合并后的行数与df1相同,合并后的列数为df1+df2之和。

4. 总结

(1) 简单粗暴拼接用concate
(2)复杂拼接用merge

参考:

https://www.cnblogs.com/guxh/p/9451532.html

合并两个pd表

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

**星光*

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值