pandas
库中的 concat()
方法是用于合并多个 DataFrame
或 Series
对象的一种强大工具。它提供了多种灵活的方式来合并数据,包括按行或按列合并,以及处理索引和列的排序等问题。下面详细介绍 concat()
方法的使用方式和注意事项。
基本语法
pandas.concat(objs, axis=0, join='outer', ignore_index=False, keys=None, levels=None, names=None, verify_integrity=False, sort=False, copy=True)
参数说明
-
objs:
一个包含需要合并的DataFrame
或Series
对象的列表、元组或字典。例如:[df1, df2, df3]
或{key1: df1, key2: df2}
。 -
axis:
指定合并的轴方向。0
或'index'
表示按行合并(垂直方向),1
或'columns'
表示按列合并(水平方向)。 -
join:
指定合并方式。'outer'
表示全外连接(所有行或列),'inner'
表示内连接(共有部分)。 -
ignore_index:
布尔值,默认为False
。如果为True
,合并后的新数据框将重新生成索引(即新的数据框将会有从 0 开始的连续索引)。 -
keys:
用于在合并后的数据框中添加层次化索引。可以是一个列表或元组,例如['key1', 'key2']
。 -
levels:
用于指定层次化索引的级别,与keys
参数配合使用。 -
names:
用于命名层次化索引的名称,与keys
和levels
参数配合使用。 -
verify_integrity:
布尔值,默认为False
。如果为True
,则在合并过程中会检查是否有重复的索引,如果有重复的索引会抛出异常。 -
sort:
布尔值,默认为False
。如果为True
,则在合并过程中会对列进行排序。在pandas
1.3.0 及以后的版本中,这个参数默认为False
,不进行排序。 -
copy:
布尔值,默认为True
。如果为False
,则避免不必要的复制操作。
示例代码
示例 1:按行合并(垂直方向)
import pandas as pd
# 创建两个 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])
# 按行合并 df1 和 df2
result = pd.concat([df1, df2])
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
示例 2:按列合并(水平方向)
# 创建两个 DataFrame
df1 = pd.DataFrame({
'A': ['A0', 'A1', 'A2', 'A3'],
'B': ['B0', 'B1', 'B2', 'B3']
}, index=[0, 1, 2, 3])
df2 = pd.DataFrame({
'C': ['C0', 'C1', 'C2', 'C3'],
'D': ['D0', 'D1', 'D2', 'D3']
}, index=[0, 1, 2, 3])
# 按列合并 df1 和 df2
result = pd.concat([df1, df2], axis=1)
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
示例 3:使用 join='inner'
进行内连接
# 创建两个 DataFrame
df1 = pd.DataFrame({
'A': ['A0', 'A1', 'A2', 'A3'],
'B': ['B0', 'B1', 'B2', 'B3']
}, index=[0, 1, 2, 3])
df2 = pd.DataFrame({
'B': ['B4', 'B5', 'B6', 'B7'],
'C': ['C4', 'C5', 'C6', 'C7']
}, index=[2, 3, 4, 5])
# 按行合并 df1 和 df2,使用内连接
result = pd.concat([df1, df2], join='inner')
print(result)
输出:
B
2 B2
3 B3
2 B4
3 B5
示例 4:使用 keys
参数添加层次化索引
# 创建两个 DataFrame
df1 = pd.DataFrame({
'A': ['A0', 'A1', 'A2', 'A3'],
'B': ['B0', 'B1', 'B2', 'B3']
}, index=[0, 1, 2, 3])
df2 = pd.DataFrame({
'A': ['A4', 'A5', 'A6', 'A7'],
'B': ['B4', 'B5', 'B6', 'B7']
}, index=[4, 5, 6, 7])
# 按行合并 df1 和 df2,并添加层次化索引
result = pd.concat([df1, df2], keys=['df1', 'df2'])
print(result)
输出:
A B
df1 0 A0 B0
1 A1 B1
2 A2 B2
3 A3 B3
df2 4 A4 B4
5 A5 B5
6 A6 B6
7 A7 B7
注意事项
-
性能问题:
concat()
方法会在内存中创建一个新的 DataFrame,因此在大数据量的场景下性能可能较差。如果需要频繁合并数据,建议使用DataFrame.loc
方法或其他更高效的方法。 -
索引处理: 如果不使用
ignore_index=True
,合并后的 DataFrame 索引将是原始 DataFrame 索引的组合,可能会导致索引不连续。 -
类型匹配: 合并的数据框的列名和数据类型需要与原数据框匹配,否则可能会导致数据缺失或类型转换问题。
-
重复索引: 如果
verify_integrity=True
,合并过程中会检查是否有重复的索引,防止数据覆盖。 -
列的排序: 如果
sort=True
,合并后的 DataFrame 的列会按字母顺序排序。
总结
concat()
方法是一个非常灵活且功能强大的数据合并工具,适用于多种合并场景,可以按行或按列合并,支持全外连接、内连接,还可以添加层次化索引。对于大规模数据或频繁合并操作,建议结合其他方法(如 DataFrame.loc
)以提高性能。