series 合并pandas_pandas小结(五)concat数据合并

pandas数据的行更新、表合并等操作,一般用到的方法有concat、join、merge。本篇先说concat方法。其具体用法如下:

pd.concat(objs, axis=0, join='outer', join_axes=None, ignore_index=False,

keys=None, levels=None, names=None, verify_integrity=False)

常用参数说明:objs: series,dataframe或者是panel构成的序列lsit

axis: 需要合并链接的轴,0是行,1是列

join:连接的方式 inner,或者outer。inner取两表的交集;outer取两表的并集。

一、相同字段的表首尾相接

import pandas as pd

df1 = pd.DataFrame({'A': ['A0', 'A1', 'A2', 'A3'],

'B': ['B0', 'B1', 'B2', 'B3'],

'C': ['C0', 'C1', 'C2', 'C3'],

'D': ['D0', 'D1', 'D2', 'D3']},

index=[0, 1, 2, 3])

print(df1)

print('---------------------------------')

df2 = pd.DataFrame({'A': ['A4', 'A5', 'A6', 'A7'],

'B': ['B4', 'B5', 'B6', 'B7'],

'C': ['C4', 'C5', 'C6', 'C7'],

'D': ['D4', 'D5', 'D6', 'D7']},

index=[4, 5, 6, 7])

print(df2)

print('---------------------------------')

df3 = pd.DataFrame({'A': ['A8', 'A9', 'A10', 'A11'],

'B': ['B8', 'B9', 'B10', 'B11'],

'C': ['C8', 'C9', 'C10', 'C11'],

'D': ['D8', 'D9', 'D10', 'D11']},

index=[8, 9, 10, 11])

print(df3)

print('---------------------------------')

frames = [df1, df2, df3]

result = pd.concat(frames)

print(result)

执行合并后结果如下:

A B C D

0 A0 B0 C0 D0

1 A1 B1 C1 D1

2 A2 B2 C2 D2

3 A3 B3 C3 D3

---------------------------------

A B C D

4 A4 B4 C4 D4

5 A5 B5 C5 D5

6 A6 B6 C6 D6

7 A7 B7 C7 D7

---------------------------------

A B C D

8 A8 B8 C8 D8

9 A9 B9 C9 D9

10 A10 B10 C10 D10

11 A11 B11 C11 D11

---------------------------------

A B C D

0 A0 B0 C0 D0

1 A1 B1 C1 D1

2 A2 B2 C2 D2

3 A3 B3 C3 D3

4 A4 B4 C4 D4

5 A5 B5 C5 D5

6 A6 B6 C6 D6

7 A7 B7 C7 D7

8 A8 B8 C8 D8

9 A9 B9 C9 D9

10 A10 B10 C10 D10

11 A11 B11 C11 D11

如要在相接的时候在加上一个层次的key来识别数据源自于哪张表,可以增加key参数

result2 = pd.concat(frames, keys=['x', 'y', 'z'])

print(result2)

执行后输出结果如下:

A B C D

x 0 A0 B0 C0 D0

1 A1 B1 C1 D1

2 A2 B2 C2 D2

3 A3 B3 C3 D3

y 4 A4 B4 C4 D4

5 A5 B5 C5 D5

6 A6 B6 C6 D6

7 A7 B7 C7 D7

z 8 A8 B8 C8 D8

9 A9 B9 C9 D9

10 A10 B10 C10 D10

11 A11 B11 C11 D11

此时可以通过增加的key信息取得相应的数据。

print(result2.loc['y'])

输出结果如下:

ABCD

4A4B4C4D4

5A5B5C5D5

6A6B6C6D6

7A7B7C7D7

二、横向拼接

1、axis

这里再创建一个测试用的数据,使用axis=1表示进行横向拼接。即列拼接。df4 = pd.DataFrame({'B': ['B2', 'B3', 'B6', 'B7'],

'D': ['D2', 'D3', 'D6', 'D7'],

'F': ['F2', 'F3', 'F6', 'F7']},

index=[2, 3, 6, 7])

result3 = pd.concat([df1, df4], axis=1)

print(result3)

合并后的结果如下:

A B C D B D F

0 A0 B0 C0 D0 NaN NaN NaN

1 A1 B1 C1 D1 NaN NaN NaN

2 A2 B2 C2 D2 B2 D2 F2

3 A3 B3 C3 D3 B3 D3 F3

6 NaN NaN NaN NaN B6 D6 F6

7 NaN NaN NaN NaN B7 D7 F7

2、 join

join参数有outer和inner两种连接方式,前者表示外连接,后者表示内连接。其中一个是取交集一个是取并集,这个在全文开始的时候已经说明:

result = pd.concat([df1, df4], axis=1, join='inner')

print(result)

执行结果如下:

A B C D B D F

2 A2 B2 C2 D2 B2 D2 F2

3 A3 B3 C3 D3 B3 D3 F3

3、 join_axes

如果有join_axes的参数传入,可以指定根据那个轴来对齐数据。例如根据df1表对齐数据,就会保留指定的df1表的轴,然后将df4的表与之拼接:

result = pd.concat([df1, df4], axis=1, join_axes=[df1.index])

print(result)

执行后输出结果如下:

A B C D B D F

0 A0 B0 C0 D0 NaN NaN NaN

1 A1 B1 C1 D1 NaN NaN NaN

2 A2 B2 C2 D2 B2 D2 F2

3 A3 B3 C3 D3 B3 D3 F3

从上面的输出来看,df4对接的索引6、7两行的值并未合并在一起。

三、append

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

result = df1.append(df4)

print(result)

输出结果如下:

A B C D F

0 A0 B0 C0 D0 NaN

1 A1 B1 C1 D1 NaN

2 A2 B2 C2 D2 NaN

3 A3 B3 C3 D3 NaN

2 NaN B2 NaN D2 F2

3 NaN B3 NaN D3 F3

6 NaN B6 NaN D6 F6

7 NaN B7 NaN D7 F7

四、忽略index的concat

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

result = pd.concat([df1, df4], ignore_index=True)

print(result)

执行结果如下:

A B C D F

0 A0 B0 C0 D0 NaN

1 A1 B1 C1 D1 NaN

2 A2 B2 C2 D2 NaN

3 A3 B3 C3 D3 NaN

4 NaN B2 NaN D2 F2

5 NaN B3 NaN D3 F3

6 NaN B6 NaN D6 F6

7 NaN B7 NaN D7 F7

这个也可以使用append,两者执行的结果是等价的,上面的语句执行的结果的结果和如下的相同:

result = df1.append(df4, ignore_index=True)

五、混合合并

可以使用Series 和DataFrame 两种类型的对象进行合并:

s1 = pd.Series(['X0', 'X1', 'X2', 'X3'], name='X')

result = pd.concat([df1, s1], axis=1)

print(result)

执行结果如下:

A B C D X

0 A0 B0 C0 D0 X0

1 A1 B1 C1 D1 X1

2 A2 B2 C2 D2 X2

3 A3 B3 C3 D3 X3

同样也可以执行多次合并,如下:

s2 = pd.Series(['_0', '_1', '_2', '_3'])

result = pd.concat([df1, s2, s2, s2], axis=1)

print(result)

执行结果如下:

A B C D 0 1 2

0 A0 B0 C0 D0 _0 _0 _0

1 A1 B1 C1 D1 _1 _1 _1

2 A2 B2 C2 D2 _2 _2 _2

3 A3 B3 C3 D3 _3 _3 _3

上面我们也提到了ignore_index,同样也可以对列名称进行忽略操作,使用索引号如下:

result = pd.concat([df1, s1], axis=1, ignore_index=True)

print(result)

执行结果如下:

0 1 2 3 4

0 A0 B0 C0 D0 X0

1 A1 B1 C1 D1 X1

2 A2 B2 C2 D2 X2

3 A3 B3 C3 D3 X3

六、增加key参数的合并

增加key参数主要是便于区分合并前的数据。这个前面已经提了一种直接使用key参数,另外还有一种可以使用字典的方式实现区分合并前的值:

1、直接用key参数实现:

result = pd.concat(frames, keys=['x', 'y', 'z'])

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

pieces = {'x': df1, 'y': df2, 'z': df3}

result = pd.concat(pieces)

参考页面:官方文档


版权声明:本文为weixin_39901558原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。