Pandas宝藏函数-concat()
在数据处理过程中,经常会遇到多个表进行拼接合并的需求,在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 C01 A1 B1 C12 A2 B2 C23 A3 B3 C3df2 0 A4 B4 C41 A5 B5 C52 A6 B6 C63 A7 B7 C7df3 0 A8 B8 C81 A9 B9 C92 A10 B10 C103 A11 B11 C11三、横向拼接 
1、axis 
#再构建一个表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' 取交集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' 和 默认值相同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方法 
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 
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六、增加区分组键 
1、可以直接用key参数实现 
keys=['x', 'y', 'z'])A B Cx 0 A0 B0 C01 A1 B1 C12 A2 B2 C23 A3 B3 C3y 0 A4 B4 C41 A5 B5 C52 A6 B6 C63 A7 B7 C7z 0 A8 B8 C81 A9 B9 C92 A10 B10 C103 A11 B11 C11
2、传入字典来增加分组键 
frames = {'df1':df1, 'df2':df2,'df3':df3}result = pd.concat(frames)A B Cdf1 0 A0 B0 C01 A1 B1 C12 A2 B2 C23 A3 B3 C3df2 0 A4 B4 C41 A5 B5 C52 A6 B6 C63 A7 B7 C7df3 0 A8 B8 C81 A9 B9 C92 A10 B10 C103 A11 B11 C11
七、加入新的行 
1、列字段相同的加入 
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、列字段不同的加入 
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中的各种索引 iloc,loc,ix,iat,at,直接索引
评论
