Python | pandas.concat:连接数据的“万能胶”

在 pandas 下,可以对多种不同类型的数据进行粘结,包括 DataFrame、Series,甚至字典都可以合在一起,可以说是“万能胶”了。

在 Python 中 Pandas 提供了许多组合数据的手段,下面主要介绍 concat 的用法。

现有3个 DataFrame 分别是:df1、df2、df3:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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])
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])

使用 Pandas 将3个 DataFrame 组合起来也是特别简单的,只需

1
result = pd.concat([df1, df2, df3])

假如将 DataFrame 组合起来后,又有从 result 中提取 DataFrame 的需要呢?只需要在组合的时候添加 keys 参数就好了。

1
2
frames = [df1, df2, df3]
result = pd.concat(frames, keys=['x', 'y', 'z'])

如果需要提取 df2,

1
2
3
4
5
6
7
In [7]: result.loc['y']
Out[7]:
A B C D
4 A4 B4 C4 D4
5 A5 B5 C5 D5
6 A6 B6 C6 D6
7 A7 B7 C7 D7

在拼接 DataFrame 时,通过设置参数join你还可以决定只拼接哪些轴,比如,有 df4,

1
2
3
4
df4 = pd.DataFrame({'B': ['B2', 'B3', 'B6', 'B7'],
'D': ['D2', 'D3', 'D6', 'D7'],
'F': ['F2', 'F3', 'F6', 'F7']},
index=[2, 3, 6, 7])

在默认情况下,pandas 会将两个 DataFrame 完全粘结起来,这种连接方式保证了信息的零丢失,

1
2
# 默认join='outer'
result = pd.concat([df1, df4], axis=1)

当参数设置为join='inner',可以理解为从两个 DataFrame 中取交集,

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

当然,Series 也可以与 DataFrame 连接,比如,

1
2
s1 = pd.Series(['X0', 'X1', 'X2', 'X3'], name='X')
result = pd.concat([df1, s1], axis=1)

如果不喜欢 Series “讨厌”的名字,设置参数ignore_index=True便可以去掉重新索引,

1
result = pd.concat([df1, s1], axis=1, ignore_index=True)
觉得还不错?帮我赞助点域名费吧:)