在数据处理过程中,经常会遇到多个表进行拼接合并的需求,在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:l ist,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 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 当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 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加上join参数的属性,如果为'inner'得到的是两表的交集,如果是outer,得到的是两表的并集。 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 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是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都没有实际含义,使用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来区分不同的表数据来源 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 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 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如果遇到两张表的列字段本来就不一样,但又想将两个表合并,其中无效的值用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