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方法的理解对于进行数据分析和机器学习等任务都非常有帮助。