超详细,数据处理过程中 Python 宝藏函数:concat()真的不错哦

在数据处理过程中,经常会遇到多个表进行拼接合并的需求,在 Pandas 中有多个拼接合并的方法,每种方法都有自己擅长的拼接方式,本文对pd.concat()进行详细讲解,希望对你有帮助。

干货推荐

一、基本语法

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

技术交流

欢迎转载、收藏、有所收获点赞支持一下!

目前开通了技术交流群,群友已超过1000人,添加时最好的备注方式为:来源+兴趣方向,方便找到志同道合的朋友

  • 方式①、发送如下图片至微信,长按识别,后台回复:加群;
  • 方式②、添加微信号:dkl88191,备注:来自CSDN
  • 方式③、微信搜索公众号:Python学习与数据挖掘,后台回复:加群

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值