如何使用 Pandas 的concat函数来合并一个列表中的多个 DataFrame
参考:pandas concat list of dataframes
在数据分析和数据处理中,经常需要将多个数据框(DataFrame)合并为一个单一的数据框。Pandas 提供了一个非常强大的函数 concat()
,用于在轴向上合并多个对象。本文将详细介绍如何使用 Pandas 的 concat()
函数来合并一个列表中的多个 DataFrame,并提供多个示例代码来展示不同的使用场景。
1. 基本使用方法
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 的列表或字典。axis
: 合并的轴向,默认为0,表示纵向合并;设置为1表示横向合并。join
: 合并的方式,默认为 ‘outer’,表示取并集;’inner’ 表示取交集。ignore_index
: 是否忽略原有的索引。keys
: 用于创建层次化索引的值。verify_integrity
: 检查新的合并的 DataFrame 是否包含重复的索引。sort
: 是否在合并时对索引进行排序。copy
: 是否复制数据,默认为 True。
示例代码 1:基本的纵向合并
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])
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])
# 合并数据框
result = pd.concat([df1, df2])
print(result)
Output:
示例代码 2:横向合并
import pandas as pd
# 创建数据框
df1 = pd.DataFrame({
'A': ['A0', 'A1', 'A2', 'A3'],
'B': ['B0', 'B1', 'B2', 'B3']
})
df2 = pd.DataFrame({
'C': ['C0', 'C1', 'C2', 'C3'],
'D': ['D0', 'D1', 'D2', 'D3']
})
# 横向合并数据框
result = pd.concat([df1, df2], axis=1)
print(result)
Output:
示例代码 3:使用 ignore_index 参数
import pandas as pd
# 创建数据框
df1 = pd.DataFrame({
'A': ['A0', 'A1', 'A2', 'A3'],
'B': ['B0', 'B1', 'B2', 'B3']
})
df2 = pd.DataFrame({
'A': ['A4', 'A5', 'A6', 'A7'],
'B': ['B4', 'B5', 'B6', 'B7']
})
# 忽略原有索引,重新生成索引
result = pd.concat([df1, df2], ignore_index=True)
print(result)
Output:
示例代码 4:使用 keys 参数创建层次化索引
import pandas as pd
# 创建数据框
df1 = pd.DataFrame({
'A': ['A0', 'A1', 'A2', 'A3'],
'B': ['B0', 'B1', 'B2', 'B3']
})
df2 = pd.DataFrame({
'A': ['A4', 'A5', 'A6', 'A7'],
'B': ['B4', 'B5', 'B6', 'B7']
})
# 使用 keys 参数
result = pd.concat([df1, df2], keys=['df1', 'df2'])
print(result)
Output:
2. 处理不同的列名
在实际的数据处理过程中,我们经常会遇到需要合并的 DataFrame 拥有不同的列名的情况。这时候,concat()
函数提供了多种参数来处理这种情况。
示例代码 5:合并具有不同列名的 DataFrame
import pandas as pd
# 创建数据框
df1 = pd.DataFrame({
'A': ['A0', 'A1', 'A2', 'A3'],
'B': ['B0', 'B1', 'B2', 'B3']
})
df2 = pd.DataFrame({
'C': ['C0', 'C1', 'C2', 'C3'],
'D': ['D0', 'D1', 'D2', 'D3']
})
# 合并数据框,使用外连接
result = pd.concat([df1, df2], axis=1, join='outer')
print(result)
Output:
示例代码 6:使用内连接合并具有不同列名的 DataFrame
import pandas as pd
# 创建数据框
df1 = pd.DataFrame({
'A': ['A0', 'A1', 'A2', 'A3'],
'B': ['B0', 'B1', 'B2', 'B3']
})
df2 = pd.DataFrame({
'C': ['C0', 'C1', 'C2', 'C3'],
'D': ['D0', 'D1', 'D2', 'D3']
})
# 合并数据框,使用内连接
result = pd.concat([df1, df2], axis=1, join='inner')
print(result)
Output:
3. 处理重复的索引
在合并多个 DataFrame 时,如果不处理索引,可能会出现重复索引的问题。concat()
函数提供了 verify_integrity
参数来检查是否有重复的索引。
示例代码 7:检查重复索引
import pandas as pd
# 创建数据框
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=[3, 4, 5, 6]) # 注意这里的索引3是重复的
# 尝试合并数据框,检查重复索引
try:
result = pd.concat([df1, df2], verify_integrity=True)
print(result)
except ValueError as e:
print("Error:", e)
Output:
4. 性能考虑
当合并大量的 DataFrame 时,性能成为一个重要的考虑因素。concat()
函数的 copy
参数可以用来控制是否复制数据,从而可能影响性能。
示例代码 8:控制数据复制以优化性能
import pandas as pd
# 创建数据框
df1 = pd.DataFrame({
'A': ['A0', 'A1', 'A2', 'A3'],
'B': ['B0', 'B1', 'B2', 'B3']
})
df2 = pd.DataFrame({
'A': ['A4', 'A5', 'A6', 'A7'],
'B': ['B4', 'B5', 'B6', 'B7']
})
# 合并数据框,不复制数据
result = pd.concat([df1, df2], copy=False)
print(result)
Output:
5. 使用场景和示例
在数据处理的不同阶段,我们可能会遇到各种需要合并数据框的场景。以下是一些具体的使用场景和相应的示例代码。
示例代码 9:合并具有相同结构的多个数据框
假设我们有多个具有相同列的数据框,我们需要将它们合并成一个大的数据框。
import pandas as pd
# 创建多个数据框
df1 = pd.DataFrame({
'A': ['A0', 'A1', 'A2', 'A3'],
'B': ['B0', 'B1', 'B2', 'B3'],
'C': ['C0', 'C1', 'C2', 'C3']
})
df2 = pd.DataFrame({
'A': ['A4', 'A5', 'A6', 'A7'],
'B': ['B4', 'B5', 'B6', 'B7'],
'C': ['C4', 'C5', 'C6', 'C7']
})
df3 = pd.DataFrame({
'A': ['A8', 'A9', 'A10', 'A11'],
'B': ['B8', 'B9', 'B10', 'B11'],
'C': ['C8', 'C9', 'C10', 'C11']
})
# 合并数据框
result = pd.concat([df1, df2, df3])
print(result)
Output:
示例代码 10:合并时添加源数据框的标识
在合并数据框时,有时候我们需要知道每行数据来自于哪个原始的数据框。
import pandas as pd
# 创建数据框
df1 = pd.DataFrame({
'A': ['A0', 'A1', 'A2', 'A3'],
'B': ['B0', 'B1', 'B2', 'B3']
})
df2 = pd.DataFrame({
'A': ['A4', 'A5', 'A6', 'A7'],
'B': ['B4', 'B5', 'B6', 'B7']
})
# 合并数据框,并标记来源
result = pd.concat([df1, df2], keys=['来源1', '来源2'])
print(result)
Output:
示例代码 11:处理具有不同列并使用外连接的数据框
在实际应用中,我们可能需要合并结构不完全相同的数据框,并希望保留所有的列。
import pandas as pd
# 创建数据框
df1 = pd.DataFrame({
'A': ['A0', 'A1', 'A2', 'A3'],
'B': ['B0', 'B1', 'B2', 'B3']
})
df2 = pd.DataFrame({
'B': ['B4', 'B5', 'B6', 'B7'],
'C': ['C4', 'C5', 'C6', 'C7']
})
# 使用外连接合并数据框
result = pd.concat([df1, df2], join='outer')
print(result)
Output:
示例代码 12:合并时保留原有索引
有时候在合并数据框时,我们需要保留原有的索引,这在后续的数据处理中可能会用到。
import pandas as pd
# 创建数据框
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])
# 合并数据框,保留原有索引
result = pd.concat([df1, df2], ignore_index=False)
print(result)
Output:
以上示例展示了如何使用 Pandas 的 concat()
函数来处理不同的数据合并需求。通过调整参数,我们可以灵活地处理各种数据结构和需求,有效地进行数据整合和分析。