Pandas df 合并 concate merge join 三种方法总结

  1. concate

1.1语法格式及参数说明

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表示交集
(4)ignore_index=True:重建索引
(5)keys:创建层次化索引

1.2 常用功能

(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’。

1.3 范例

import numpy as np
import pandas as pd
#样集1
df1=pd.DataFrame({'A':['A0','A1','A2','A3'],'B':['B0','B1','B2','B3'],
                  'C':['C0','C1','C2','C3'],'D':['D0','D1','D2','D3']},
                index=[0,1,2,3])
#样集2
df2=pd.DataFrame({'A':['A4','A5','A6','A7'],'B':['B4','B5','B6','B7'],
                  'C':['C4','C5','C6','C7'],'D':['D4','D5','D6','D7']},
                  index=[4,5,6,7])
#样集3
df3=pd.DataFrame({'A':['A8','A9','A10','A11'],'B':['B8','B9','B10','B11'],
                  'C':['C8','C9','C10','C11'],'D':['D8','D9','D10','D11']},
                index=[8,9,10,11])
#样集4
df4=pd.DataFrame({'B':['B2','B3','B6','B7'],'D':['D2','D3','D6','D7'],
                  'F':['F2','F3','F6','F7']},index=[2,3,6,7])
#样集1、2、3、4详见图1.1(a)
#列名(columns)相同,行索引(index)无重复项的表df1、df2、df3实现行拼接
frames = [df1, df2, df3]
pd.concat(frames)                           #效果见图1.1(b)
#使用参数key可以为每个数据集指定块标记
pd.concat(frames,keys=[ 'x','y','z' ])      #效果见图1.1(c)

Pandas df 合并 concate merge join 三种方法总结
  1. merge

2.1语法格式及参数说明

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)

(1)left, right:左右两个对象,一般为df或者series。
(2)how:连接方式,默认为交集inner,还有并集outer,左侧对象left,右侧对象right
(3)on:用于连接的列索引名称,必须同时存在于左右两个df中,默认为两个df列明的交集为连接键,若要实现多键连接,则在on后传入参数。
(4)left_on\right_on:左右侧用于连接键的列名,这个参数在左右列名不同但是含义相同时非常有用。
(5)sort:合并后是否排序,默认为False,可提高性能。
(6)copy:总是将数据复制到数据结构中,默认为True,设置为False可提高性能。

2.2 常用功能

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

2.3 范例

#样集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

  1. join

3.1语法格式及参数说明

DataFrame.join(other, on=None, how='left', lsuffix=' ', rsuffix=' ', sort=False)

参数意义参考merge方法

3.2 常用功能

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

3.3 范例

#样集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')
>>>
        key_l   val_l   key_r   val_r
0       foo      1       foo    4
1       bar1     2       bar    5

  1. 总结

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

Original: https://blog.csdn.net/u010769476/article/details/115073441
Author: 解放巴斯偶
Title: Pandas df 合并 concate merge join 三种方法总结

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/753145/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球