如何使用 Pandas 的concat函数来合并一个列表中的多个 DataFrame

如何使用 Pandas 的concat函数来合并一个列表中的多个 DataFrame

参考:pandas concat list of dataframes

在数据分析和数据处理中,经常会遇到需要合并多个数据框(DataFrame)的情况。PandasPython 中一个强大的数据处理库,它提供了多种方式来合并数据,其中 concat() 函数是一个非常实用的工具,可以用来合并一个列表中的多个 DataFrame。本文将详细介绍如何使用 Pandasconcat() 函数来合并一个列表中的多个 DataFrame,并提供多个示例代码来展示其用法。

1. pandas concat 基础

Pandas 的 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: 这是一个序列或映射,比如列表,这些都是要被合并的 pandas 对象。
  • axis: {0/'index', 1/'columns'}, 默认为 0,决定了是沿着哪个轴进行连接。
  • join: {'inner', 'outer'}, 默认为 ‘outer’。’outer’ 表示取并集,’inner’ 表示取交集。
  • ignore_index: 布尔值,默认为 False。如果为 True,则不使用索引标签。
  • keys: 序列,默认为 None。如果传递了序列,则创建一个多级索引(层次化索引)。

示例代码 1: 基本的 concat 使用

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

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

# 使用 concat 合并 DataFrame
result = pd.concat([df1, df2, df3])
print(result)

Output:

如何使用 Pandas 的concat函数来合并一个列表中的多个 DataFrame

示例代码 2: 使用 ignore_index 参数

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

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

result = pd.concat([df1, df2, df3], ignore_index=True)
print(result)

Output:

如何使用 Pandas 的concat函数来合并一个列表中的多个 DataFrame

示例代码 3: 使用 keys 参数创建多级索引

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

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

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

Output:

如何使用 Pandas 的concat函数来合并一个列表中的多个 DataFrame

示例代码 4: 沿着 columns 轴进行 concat

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

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

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

Output:

如何使用 Pandas 的concat函数来合并一个列表中的多个 DataFrame

2. 处理不同列名的 DataFrame

当合并的 DataFrame 拥有不同的列名时,concat() 函数提供了多种处理方式。默认情况下,它会取所有 DataFrame 的列的并集,不存在的值会被填充为 NaN。

示例代码 5: 处理不同列名的 DataFrame

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

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

df4 = pd.DataFrame({
    'A': ['A12', 'A13', 'A14', 'A15'],
    'B': ['B12', 'B13', 'B14', 'B15'],
    'C': ['C12', 'C13', 'C14', 'C15'],
    'E': ['E12', 'E13', 'E14', 'E15']  # 注意这里的列名是 'E'
}, index=[12, 13, 14, 15])

result = pd.concat([df1, df4])
print(result)

Output:

如何使用 Pandas 的concat函数来合并一个列表中的多个 DataFrame

示例代码 6: 使用 join=’inner’ 参数

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

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

df4 = pd.DataFrame({
    'A': ['A12', 'A13', 'A14', 'A15'],
    'B': ['B12', 'B13', 'B14', 'B15'],
    'C': ['C12', 'C13', 'C14', 'C15'],
    'E': ['E12', 'E13', 'E14', 'E15']  # 注意这里的列名是 'E'
}, index=[12, 13, 14, 15])

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

Output:

如何使用 Pandas 的concat函数来合并一个列表中的多个 DataFrame

3. 使用 concat 进行复杂的数据合并

在实际的数据处理过程中,我们可能需要根据不同的需求进行更复杂的数据合并操作。例如,我们可能需要在合并时保持原有的索引,或者我们可能需要添加额外的列来标识数据来源等。

示例代码 7: 保持原有索引

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

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

df4 = pd.DataFrame({
    'A': ['A12', 'A13', 'A14', 'A15'],
    'B': ['B12', 'B13', 'B14', 'B15'],
    'C': ['C12', 'C13', 'C14', 'C15'],
    'E': ['E12', 'E13', 'E14', 'E15']  # 注意这里的列名是 'E'
}, index=[12, 13, 14, 15])

result = pd.concat([df1, df2, df3], ignore_index=False)
print(result)

Output:

如何使用 Pandas 的concat函数来合并一个列表中的多个 DataFrame

示例代码 8: 添加额外的列来标识数据来源

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

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

df4 = pd.DataFrame({
    'A': ['A12', 'A13', 'A14', 'A15'],
    'B': ['B12', 'B13', 'B14', 'B15'],
    'C': ['C12', 'C13', 'C14', 'C15'],
    'E': ['E12', 'E13', 'E14', 'E15']  # 注意这里的列名是 'E'
}, index=[12, 13, 14, 15])

df1['Source'] = 'Source_1'
df2['Source'] = 'Source_2'
df3['Source'] = 'Source_3'

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

Output:

如何使用 Pandas 的concat函数来合并一个列表中的多个 DataFrame

4. 性能考虑

当处理大规模数据时,合并操作的性能变得尤为重要。Pandas 提供了一些参数来帮助优化性能,例如 copy 参数可以避免不必要的数据复制。

示例代码 9: 使用 copy 参数

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

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

df4 = pd.DataFrame({
    'A': ['A12', 'A13', 'A14', 'A15'],
    'B': ['B12', 'B13', 'B14', 'B15'],
    'C': ['C12', 'C13', 'C14', 'C15'],
    'E': ['E12', 'E13', 'E14', 'E15']  # 注意这里的列名是 'E'
}, index=[12, 13, 14, 15])

result = pd.concat([df1, df2, df3], copy=False)
print(result)

Output:

如何使用 Pandas 的concat函数来合并一个列表中的多个 DataFrame

5. 错误处理

在使用 concat() 函数时,如果数据不一致或者其他问题,可能会引发错误。verify_integrity 参数可以用来检查是否会因为重复的索引而导致错误。

示例代码 10: 使用 verify_integrity 参数

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

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

df4 = pd.DataFrame({
    'A': ['A12', 'A13', 'A14', 'A15'],
    'B': ['B12', 'B13', 'B14', 'B15'],
    'C': ['C12', 'C13', 'C14', 'C15'],
    'E': ['E12', 'E13', 'E14', 'E15']  # 注意这里的列名是 'E'
}, index=[12, 13, 14, 15])

try:
    result = pd.concat([df1, df2, df3], verify_integrity=True)
    print(result)
except ValueError as e:
    print("Error:", e)

Output:

如何使用 Pandas 的concat函数来合并一个列表中的多个 DataFrame

总结

Pandas 的 concat() 函数是一个非常强大的工具,可以帮助我们在数据分析和数据处理中有效地合并多个 DataFrame。通过上述示例代码,我们可以看到 concat() 函数在不同情况下的应用,以及如何根据具体需求选择合适的参数。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程