Pandas宝藏函数-concat()

共 5350字,需浏览 11分钟

 ·

2022-01-24 08:52

在数据处理过程中,经常会遇到多个表进行拼接合并的需求,在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 pddf1 = 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    C0   A0   B0   C01   A1   B1   C12   A2   B2   C23   A3   B3   C30   A4   B4   C41   A5   B5   C52   A6   B6   C63   A7   B7   C70   A8   B8   C81   A9   B9   C92  A10  B10  C103  A11  B11  C11

传入也可以是字典
frames = {'df1':df1, 'df2':df2,'df3':df3}result = pd.concat(frames)   A    B    Cdf1 0   A0   B0   C0    1   A1   B1   C1    2   A2   B2   C2    3   A3   B3   C3df2 0   A4   B4   C4    1   A5   B5   C5    2   A6   B6   C6    3   A7   B7   C7df3 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   F0   A0   B0   C0  C3  E3  F31   A1   B1   C1  C4  E4  F42   A2   B2   C2  C5  E5  F53   A3   B3   C3  C6  E6  F64  NaN  NaN  NaN  C7  E7  F75  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   F0  A0  B0  C0  C3  E3  F31  A1  B1  C1  C4  E4  F42  A2  B2  C2  C5  E5  F53  A3  B3  C3  C6  E6  F6
# join='outer' 和 默认值相同pd.concat([df1, df4], axis=1, join='outer') A B C C E F0 A0 B0 C0 C3 E3 F31 A1 B1 C1 C4 E4 F42 A2 B2 C2 C5 E5 F53 A3 B3 C3 C6 E6 F64 NaN NaN NaN C7 E7 F75 NaN NaN NaN C8 E8 F8

四、对比append方法
append是series和dataframe的方法,使用它就是默认沿着列进行凭借(axis = 0,列对齐)
df1.append(df2)    A   B   C0  A0  B0  C01  A1  B1  C12  A2  B2  C23  A3  B3  C30  A4  B4  C41  A5  B5  C52  A6  B6  C63  A7  B7  C7

五、忽略index
如果两个表的index都没有实际含义,使用ignore_index参数,置true,合并的两个表就睡根据列字段对齐,然后合并。最后再重新整理一个新的index。 
pd.concat([df1, df4], axis=1, ignore_index=True)     0    1    2   3   4   50   A0   B0   C0  C3  E3  F31   A1   B1   C1  C4  E4  F42   A2   B2   C2  C5  E5  F53   A3   B3   C3  C6  E6  F64  NaN  NaN  NaN  C7  E7  F75  NaN  NaN  NaN  C8  E8  F8

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

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

pd.concat([df1,df2,df3], keys=['x', 'y', 'z']) A    B    Cx 0   A0   B0   C0  1   A1   B1   C1  2   A2   B2   C2  3   A3   B3   C3y 0   A4   B4   C4  1   A5   B5   C5  2   A6   B6   C6  3   A7   B7   C7z 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    Cdf1 0   A0   B0   C0    1   A1   B1   C1    2   A2   B2   C2    3   A3   B3   C3df2 0   A4   B4   C4    1   A5   B5   C5    2   A6   B6   C6    3   A7   B7   C7df3 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 D0 A0 B0 C0 NaN1 A1 B1 C1 NaN2 A2 B2 C2 NaN3 A3 B3 C3 NaN4 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 Y0 A0 B0 C0 NaN NaN1 A1 B1 C1 NaN NaN2 A2 B2 C2 NaN NaN3 A3 B3 C3 NaN NaN4 1 2 3 4.0 NaN5 5 6 7 NaN 8.0
···  END  ···
关联阅读:
Pandas中的宝藏函数-transform()

Pandas中的宝藏函数-map

Pandas中的宝藏函数-apply

Pandas中的宝藏函数-applymap

Pandas中的宝藏函数-agg()

Pandas中的宝藏函数-rank()

一文搞懂Pandas数据排序

Pandas缺失值处理-判断和删除

一网打尽Pandas中的各种索引 iloc,loc,ix,iat,at,直接索引


扫描关注本号↓
浏览 36
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报