Pandas concat dataframes

Pandas concat dataframes

参考:pandas concat dataframes

在数据分析和数据处理中,经常需要将多个数据集合并为一个大的数据集。Pandas 提供了多种方式来合并数据,其中 concat() 函数是一个非常强大的工具,用于在轴向上连接或“堆叠”多个 DataFrame 对象。本文将详细介绍如何使用 pandas 的 concat() 函数来合并数据框,包括不同的参数和它们的用途,以及如何处理索引、列不对齐等问题。

基本用法

pandas.concat() 可以将多个 DataFrame 或 Series 沿着一个轴进行合并。它的基本语法如下:

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: 布尔值,默认为False。如果为True,则不使用原来的索引值,而是创建一个新的索引。
  • keys: 用于创建层次化索引的值,提供一个标签或标签的列表。
  • levels: 指定用作层次化索引各级别的索引。
  • names: 用于结果层次化索引的名称。
  • verify_integrity: 布尔值,默认为False。如果为True,则检查新的合并的轴是否包含重复项。如果有,则引发异常。
  • sort: 布尔值,默认为False。在合并时,是否对索引进行排序。
  • copy: 布尔值,默认为True。是否复制数据,或者尽可能保留原始数据。

示例代码

示例 1: 纵向合并两个 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])

# 使用 concat 进行纵向合并
result = pd.concat([df1, df2])
print(result)

Output:

Pandas concat dataframes

示例 2: 横向合并两个 DataFrame

import pandas as pd

# 创建两个 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])

# 使用 concat 进行横向合并
result = pd.concat([df1, df2], axis=1)
print(result)

Output:

Pandas concat dataframes

示例 3: 使用 ignore_index 参数

import pandas as pd

# 创建两个 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=[0, 1, 2, 3])

# 使用 concat 进行纵向合并,并忽略原有索引
result = pd.concat([df1, df2], ignore_index=True)
print(result)

Output:

Pandas concat dataframes

示例 4: 使用 keys 参数创建层次化索引

import pandas as pd

# 创建两个 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])

# 使用 concat 进行纵向合并,并使用 keys 创建层次化索引
result = pd.concat([df1, df2], keys=['df1', 'df2'])
print(result)

Output:

Pandas concat dataframes

示例 5: 使用 join 参数进行内连接

import pandas as pd

# 创建两个 DataFrame
df1 = pd.DataFrame({
    'A': ['A0', 'A1', 'A2', 'A3'],
    'B': ['B0', 'B1', 'B2', 'B3']
}, index=[0, 1, 2, 3])

df2 = pd.DataFrame({
    'B': ['B0', 'B1', 'B2', 'B3'],
    'C': ['C0', 'C1', 'C2', 'C3']
}, index=[0, 1, 2, 3])

# 使用 concat 进行横向合并,并进行内连接
result = pd.concat([df1, df2], axis=1, join='inner')
print(result)

Output:

Pandas concat dataframes

示例 6: 使用 verify_integrity 参数检查索引重复

import pandas as pd

# 创建两个 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=[2, 3, 4, 5])

# 使用 concat 进行纵向合并,并检查索引重复
try:
    result = pd.concat([df1, df2], verify_integrity=True)
    print(result)
except ValueError as e:
    print("Error:", e)

Output:

Pandas concat dataframes

示例 7: 使用 sort 参数对索引进行排序

import pandas as pd

# 创建两个 DataFrame
df1 = pd.DataFrame({
    'A': ['A0', 'A1', 'A2', 'A3'],
    'B': ['B0', 'B1', 'B2', 'B3']
}, index=[3, 2, 1, 0])

df2 = pd.DataFrame({
    'A': ['A4', 'A5', 'A6', 'A7'],
    'B': ['B4', 'B5', 'B6', 'B7']
}, index=[7, 6, 5, 4])

# 使用 concat 进行纵向合并,并对索引进行排序
result = pd.concat([df1, df2], sort=True)
print(result)

Output:

Pandas concat dataframes

示例 8: 合并具有不同列的 DataFrame

import pandas as pd

# 创建两个 DataFrame
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']
})

# 使用 concat 进行横向合并,处理不同的列
result = pd.concat([df1, df2], axis=1)
print(result)

Output:

Pandas concat dataframes

示例 9: 使用多个 keys 创建更复杂的层次化索引

import pandas as pd

# 创建三个 DataFrame
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']
})

df3 = pd.DataFrame({
    'A': ['A8', 'A9', 'A10', 'A11'],
    'B': ['B8', 'B9', 'B10', 'B11']
})

# 使用 concat 进行纵向合并,并使用多个 keys 创建更复杂的层次化索引
result = pd.concat([df1, df2, df3], keys=['Group1', 'Group2', 'Group3'])
print(result)

Output:

Pandas concat dataframes

示例 10: 合并时使用不同的 join_axes 参数(已弃用,使用 reindex 替代)

import pandas as pd

# 创建两个 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=[2, 3, 4, 5])

# 使用 concat 进行横向合并,并使用 reindex 替代 join_axes
result = pd.concat([df1, df2], axis=1).reindex(df1.index)
print(result)

Output:

Pandas concat dataframes

示例 11: 忽略原有索引并创建新索引

import pandas as pd

# 创建两个 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])

# 使用 concat 进行纵向合并,忽略原有索引并创建新索引
result = pd.concat([df1, df2], ignore_index=True)
print(result)

Output:

Pandas concat dataframes

示例 12: 合并时处理重复的列名

import pandas as pd

# 创建两个 DataFrame,具有重复的列名
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']
})

# 使用 concat 进行纵向合并,处理重复的列名
result = pd.concat([df1, df2], ignore_index=True)
print(result)

Output:

Pandas concat dataframes

示例 13: 使用自定义函数处理合并后的数据

import pandas as pd

# 创建两个 DataFrame
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']
})

# 使用 concat 进行纵向合并
result = pd.concat([df1, df2])

# 使用自定义函数处理合并后的数据
def process_data(df):
    df['A'] = df['A'].apply(lambda x: x.replace('A', 'NewA'))
    return df

processed_result = process_data(result)
print(processed_result)

Output:

Pandas concat dataframes

示例 14: 合并多个具有相同结构的 DataFrame

import pandas as pd

# 创建多个 DataFrame
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']
})

df3 = pd.DataFrame({
    'A': ['A8', 'A9', 'A10', 'A11'],
    'B': ['B8', 'B9', 'B10', 'B11']
})

# 使用 concat 进行纵向合并
result = pd.concat([df1, df2, df3])
print(result)

Output:

Pandas concat dataframes

以上示例展示了如何使用 pandas 的 concat() 函数来合并 DataFrame,包括处理索引、列不对齐、层次化索引等多种情况。通过这些示例,可以看到 concat() 是处理数据合并任务时非常灵活和强大的工具。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程