pd.concat数据拼接

1. 简介

在数据分析处理中,不同来源的数据往往需要进行合并。这就需用到pandas库中的一个方法——pd.concat。pd.concat是一个可以将多个数据框或多个Series对象进行合并、拼接的函数。

2. concat函数基本用法

2.1 合并Series对象

pd.concat可以将多个Series对象进行合并,就像是将多个序列进行连接拼接。例如下面有两个序列:

import pandas as pd

import numpy as np

s1 = pd.Series([1, 2, 3], index=['a', 'b', 'c'])

s2 = pd.Series([4, 5, 6], index=['d', 'e', 'f'])

使用pd.concat方法将s1和s2进行拼接,合并后的Series对象如下:

s3 = pd.concat([s1,s2])

print(s3)

输出结果如下:

a 1

b 2

c 3

d 4

e 5

f 6

dtype: int64

可以看到,s1和s2合并起来后,生成了新的Series对象s3。

2.2 合并DataFrame对象

pd.concat同样可以将多个DataFrame对象进行合并,就像是将多个表格进行连接。例如下面有两个表格:

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])

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])

使用pd.concat方法将df1和df2进行拼接,合并后的DataFrame对象如下:

frames = [df1, df2]

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

4 A4 B4 C4 D4

5 A5 B5 C5 D5

6 A6 B6 C6 D6

7 A7 B7 C7 D7

可以看到,df1和df2合并起来后,生成了新的DataFrame对象result。

3. concat函数详细参数

3.1 axis参数

axis参数用于设置合并的方向,当axis=0时表示纵向合并DataFrame对象,当axis=1时表示横向合并DataFrame对象。例如:

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])

df3 = pd.DataFrame({'E': ['E0', 'E1', 'E2', 'E3'],

'F': ['F0', 'F1', 'F2', 'F3'],

'G': ['G0', 'G1', 'G2', 'G3'],

'H': ['H0', 'H1', 'H2', 'H3']},

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

#纵向合并df1和df3

result1 = pd.concat([df1, df3], axis=0)

print("纵向合并结果:")

print(result1)

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

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

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

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

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

df5 = pd.DataFrame({'E': ['E4', 'E5', 'E6', 'E7'],

'F': ['F4', 'F5', 'F6', 'F7'],

'G': ['G4', 'G5', 'G6', 'G7'],

'H': ['H4', 'H5', 'H6', 'H7']},

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

#横向合并df4、df5

result2 = pd.concat([df4, df5], axis=1)

print("横向合并结果:")

print(result2)

输出结果:

纵向合并结果:

A B C D E F G H

0 A0 B0 C0 D0 NaN NaN NaN NaN

1 A1 B1 C1 D1 NaN NaN NaN NaN

2 A2 B2 C2 D2 NaN NaN NaN NaN

3 A3 B3 C3 D3 NaN NaN NaN NaN

0 NaN NaN NaN NaN E0 F0 G0 H0

1 NaN NaN NaN NaN E1 F1 G1 H1

2 NaN NaN NaN NaN E2 F2 G2 H2

3 NaN NaN NaN NaN E3 F3 G3 H3

横向合并结果:

A B C D E F G H

0 A4 B4 C4 D4 E4 F4 G4 H4

1 A5 B5 C5 D5 E5 F5 G5 H5

2 A6 B6 C6 D6 E6 F6 G6 H6

3 A7 B7 C7 D7 E7 F7 G7 H7

可以看到,axis参数的设定决定了合并的方向。

3.2 join参数

join参数用于设置合并方式,分为inner和outer两种方式。当join='inner'时表示取两个DataFrame对象的共同部分进行合并,当join='outer'时表示取两个DataFrame对象的并集进行合并。例如:

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

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

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

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

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

#横向合并df4、df6,结果中只保留相同的index项

result3 = pd.concat([df4, df6], axis=1, join='inner')

print("inner合并结果:")

print(result3)

#横向合并df4、df6,结果中保留所有index项,用NaN占位

result4 = pd.concat([df4, df6], axis=1, join='outer')

print("outer合并结果:")

print(result4)

输出结果:

inner合并结果:

A B C D A B C D

2 A6 B6 C6 D6 A4 B4 C4 D4

3 A7 B7 C7 D7 A5 B5 C5 D5

outer合并结果:

A B C D A B C D

0 A4 B4 C4 D4 NaN NaN NaN NaN

1 A5 B5 C5 D5 NaN NaN NaN NaN

2 A6 B6 C6 D6 A4 B4 C4 D4

3 A7 B7 C7 D7 A5 B5 C5 D5

4 NaN NaN NaN NaN A6 B6 C6 D6

5 NaN NaN NaN NaN A7 B7 C7 D7

6 NaN NaN NaN NaN NaN NaN NaN NaN

7 NaN NaN NaN NaN NaN NaN NaN NaN

可以看到,join参数的设定决定了合并的方式。

3.3 keys参数

keys参数用于指定用来识别来自哪个DataFrame或者Series的数据。例如:

#使用keys参数对上例df4、df5进行重新命名 

result5 = pd.concat([df4, df5], keys=['df4','df5'], axis=1)

print("keys合并结果:")

print(result5)

输出结果:

keys合并结果:

df4 df5

A B C D E F G H

0 A4 B4 C4 D4 E4 F4 G4 H4

1 A5 B5 C5 D5 E5 F5 G5 H5

2 A6 B6 C6 D6 E6 F6 G6 H6

3 A7 B7 C7 D7 E7 F7 G7 H7

可以看到,keys参数的设定增加了数据的可读性。

3.4 ignore_index参数

ignore_index用于表示合并后的DataFrame对象是否需要重新设置索引。默认值为False,表示保持原始的索引,当ignore_index=True时,表示重新设置索引。例如:

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

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

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

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

#重新设置索引

result6 = pd.concat([df4, df7], ignore_index=True)

print("ignore_index合并结果:")

print(result6)

输出结果:

ignore_index合并结果:

A B C D

0 A4 B4 C4 D4

1 A5 B5 C5 D5

2 A6 B6 C6 D6

3 A7 B7 C7 D7

可以看到,ignore_index参数设置后,索引从0开始重新排列。

3.5 append方法

append方法是pd.concat方法的另一种表示形式,用于合并两个DataFrame对象。例如:

result7 = df4.append(df5)

print("append合并结果:")

print(result7)

输出结果如下:

append合并结果:

A B C D E F G H

0 A4 B4 C4 D4 E4 F4 G4 H4

1 A5 B5 C5 D5 E5 F5 G5 H5

2 A6 B6 C6 D6 E6 F6 G6 H6

3 A7 B7 C7 D7 E7 F7 G7 H7

可以看到,两种方法均可达到相同的合并效果。

4. 总结

pd.concat方法提供了非常方便的数据合并与拼接的方式。可以灵活处理不同来源的数据,而且通过设定不同的参数,能获得不同的合并效果。加深对pd.concat方法的理解对于进行数据分析和机器学习等任务都非常有帮助。

后端开发标签