在数据处理过程中,经常会遇到多个表进行拼接合并的需求,在Pandas中有多个拼接合并的方法,每种方法都有自己擅长的拼接方式,本文对pd.concat()进行详细讲解,希望对你有帮助。pd.concat()函数可以沿着指定的轴将多个dataframe或者series拼接到一起,这一点和另一个常用的pd.merge()函数不同,pd.merge()解决数据库样式的左右拼接,不能解决上下拼接。

一、基本语法

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

二、参数含义

  • objs:Series,DataFrame或Panel对象的序列或映射,如果传递了dict,则排序的键将用作键参数

  • axis:{0,1,...},默认为0,也就是纵向上进行合并。沿着连接的轴。

  • join:{'inner','outer'},默认为“outer”。如何处理其他轴上的索引。outer为联合和inner为交集。

  • ignore_index:boolean,default False。如果为True,请不要使用并置轴上的索引值。结果轴将被标记为0,...,n-1。如果要连接其中并置轴没有有意义的索引信息的对象,这将非常有用。注意,其他轴上的索引值在连接中仍然受到尊重。

  • keys:序列,默认值无。使用传递的键作为最外层构建层次索引。如果为多索引,应该使用元组。

  • levels:序列列表,默认值无。用于构建MultiIndex的特定级别(唯一值)。否则,它们将从键推断。

  • names:list,default无。结果层次索引中的级别的名称。

  • verify_integrity:boolean,default False。检查新连接的轴是否包含重复项。这相对于实际的数据串联可能是非常昂贵的。

  • copy:boolean,default True。如果为False,请勿不必要地复制数据。

三、竖向堆叠

#构建需要的数据表
import pandas as pd
df1 = pd.DataFrame({'A':['A{}'.format(i) for i in range(0,4)],
                    'B':['B{}'.format(i) for i in range(0,4)],
                    'C':['C{}'.format(i) for i in range(0,4)]
                 })


df2 = pd.DataFrame({'A':['A{}'.format(i) for i in range(4,8)],
                    'B':['B{}'.format(i) for i in range(4,8)],
                    'C':['C{}'.format(i) for i in range(4,8)]
                 })
df3 = pd.DataFrame({'A':['A{}'.format(i) for i in range(8,12)],
                    'B':['B{}'.format(i) for i in range(8,12)],
                    'C':['C{}'.format(i) for i in range(8,12)]
                 })
现将表构成list,然后在作为concat的输入
 
 
frames = [df1, df2, df3]
result = pd.concat(frames)
 A    B    C
0   A0   B0   C0
1   A1   B1   C1
2   A2   B2   C2
3   A3   B3   C3
0   A4   B4   C4
1   A5   B5   C5
2   A6   B6   C6
3   A7   B7   C7
0   A8   B8   C8
1   A9   B9   C9
2  A10  B10  C10
3  A11  B11  C11

传入也可以是字典

 
 
frames = {'df1':df1, 'df2':df2,'df3':df3}
result = pd.concat(frames)
   A    B    C
df1 0   A0   B0   C0
    1   A1   B1   C1
    2   A2   B2   C2
    3   A3   B3   C3
df2 0   A4   B4   C4
    1   A5   B5   C5
    2   A6   B6   C6
    3   A7   B7   C7
df3 0   A8   B8   C8
    1   A9   B9   C9
    2  A10  B10  C10
    3  A11  B11  C11

三、横向拼接

1、axis

当axis = 1的时候,concat就是行对齐,然后将不同列名称的两张表合并

 
 
#再构建一个表
df4 = pd.DataFrame({'C':['C{}'.format(i) for i in range(3,9)],
                    'E':['E{}'.format(i) for i in range(3,9)],
                    'F':['F{}'.format(i) for i in range(3,9)]
                 })
pd.concat([df1,df4], axis=1)
     A    B    C   C   E   F
0   A0   B0   C0  C3  E3  F3
1   A1   B1   C1  C4  E4  F4
2   A2   B2   C2  C5  E5  F5
3   A3   B3   C3  C6  E6  F6
4  NaN  NaN  NaN  C7  E7  F7
5  NaN  NaN  NaN  C8  E8  F8

2、join

加上join参数的属性,如果为'inner'得到的是两表的交集,如果是outer,得到的是两表的并集。

 
 
#  join='inner' 取交集
pd.concat([df1, df4], axis=1, join='inner')
    A   B   C   C   E   F
0  A0  B0  C0  C3  E3  F3
1  A1  B1  C1  C4  E4  F4
2  A2  B2  C2  C5  E5  F5
3  A3  B3  C3  C6  E6  F6


# join='outer' 和 默认值相同
pd.concat([df1, df4], axis=1, join='outer')
     A    B    C   C   E   F
0   A0   B0   C0  C3  E3  F3
1   A1   B1   C1  C4  E4  F4
2   A2   B2   C2  C5  E5  F5
3   A3   B3   C3  C6  E6  F6
4  NaN  NaN  NaN  C7  E7  F7
5  NaN  NaN  NaN  C8  E8  F8

四、对比append方法

append是series和dataframe的方法,使用它就是默认沿着列进行凭借(axis = 0,列对齐)

 
 
df1.append(df2)
    A   B   C
0  A0  B0  C0
1  A1  B1  C1
2  A2  B2  C2
3  A3  B3  C3
0  A4  B4  C4
1  A5  B5  C5
2  A6  B6  C6
3  A7  B7  C7

五、忽略index

如果两个表的index都没有实际含义,使用ignore_index参数,置true,合并的两个表就睡根据列字段对齐,然后合并。最后再重新整理一个新的index。 

 
 
pd.concat([df1, df4], axis=1, ignore_index=True) 
    0    1    2   3   4   5
0   A0   B0   C0  C3  E3  F3
1   A1   B1   C1  C4  E4  F4
2   A2   B2   C2  C5  E5  F5
3   A3   B3   C3  C6  E6  F6
4  NaN  NaN  NaN  C7  E7  F7
5  NaN  NaN  NaN  C8  E8  F8

六、增加区分组键

前面提到的keys参数可以用来给合并后的表增加key来区分不同的表数据来源

1、可以直接用key参数实现

 
 
pd.concat([df1,df2,df3], keys=['x', 'y', 'z'])
 A    B    C
x 0   A0   B0   C0
  1   A1   B1   C1
  2   A2   B2   C2
  3   A3   B3   C3
y 0   A4   B4   C4
  1   A5   B5   C5
  2   A6   B6   C6
  3   A7   B7   C7
z 0   A8   B8   C8
  1   A9   B9   C9
  2  A10  B10  C10
  3  A11  B11  C11

2、传入字典来增加分组键

frames = {'df1':df1, 'df2':df2,'df3':df3}
result = pd.concat(frames)
   A    B    C
df1 0   A0   B0   C0
    1   A1   B1   C1
    2   A2   B2   C2
    3   A3   B3   C3
df2 0   A4   B4   C4
    1   A5   B5   C5
    2   A6   B6   C6
    3   A7   B7   C7
df3 0   A8   B8   C8
    1   A9   B9   C9
    2  A10  B10  C10
    3  A11  B11  C11
七、加入新的行

1、列字段相同的加入

append方法可以将 series 和 字典就够的数据作为dataframe的新一行插入。 

 
 
s2 = pd.Series(['X0', 'X1', 'X2', 'X3'], index=['A', 'B', 'C', 'D'])
df1.append(s2, ignore_index=True)
  A   B   C    D
0  A0  B0  C0  NaN
1  A1  B1  C1  NaN
2  A2  B2  C2  NaN
3  A3  B3  C3  NaN
4  X0  X1  X2   X3

2、列字段不同的加入

如果遇到两张表的列字段本来就不一样,但又想将两个表合并,其中无效的值用nan来表示。那么可以使用ignore_index来实现。

 
 
dicts = [{'A': 1, 'B': 2, 'C': 3, 'X': 4},
         {'A': 5, 'B': 6, 'C': 7, 'Y': 8}]
df1.append(dicts, ignore_index=True)
 A   B   C    X    Y
0  A0  B0  C0  NaN  NaN
1  A1  B1  C1  NaN  NaN
2  A2  B2  C2  NaN  NaN
3  A3  B3  C3  NaN  NaN
4   1   2   3  4.0  NaN
5   5   6   7  NaN  8.0

···  END  ···

 
 
 
 
 
 
 
 
 
 
往期精彩回顾




适合初学者入门人工智能的路线及资料下载中国大学慕课《机器学习》(黄海广主讲)机器学习及深度学习笔记等资料打印机器学习在线手册深度学习笔记专辑《统计学习方法》的代码复现专辑
AI基础下载本站qq群955171419,加入微信群请扫码:

fe6e71923db22ff032c48d5eece7f18b.png

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐