Pandas concat axis 详解

Pandas concat axis 详解

参考:pandas concat axis

在数据分析和数据处理中,经常需要将多个数据集合并为一个大的数据集。PandasPython 中一个强大的数据处理库,它提供了多种方式来合并数据,其中 concat 函数是一个非常重要且常用的功能。本文将详细介绍 pandas.concat 函数的 axis 参数的使用方法,并通过多个示例展示如何在实际中应用这一功能。

1. pandas.concat 简介

pandas.concat 是 pandas 库中用于合并两个或多个 pandas 对象的函数。它主要用于合并 SeriesDataFrame 对象。合并的方式可以是沿着某个轴,即横向或纵向。

函数的基本语法如下:

pandas.concat(objs, axis=0, join='outer', ignore_index=False, keys=None, levels=None, names=None, verify_integrity=False, sort=False, copy=True)

其中,axis 参数是本文的重点,它决定了合并的方向。axis=0 表示纵向合并(增加行),而 axis=1 表示横向合并(增加列)。

2. axis 参数详解

2.1 axis=0 的使用

axis=0 时,concat 函数将沿着索引轴(行)合并数据。这是默认设置,通常用于在数据集的末尾添加更多的行。

示例代码 1:纵向合并两个 DataFrame

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], axis=0)
print(result)

Output:

Pandas concat axis 详解

2.2 axis=1 的使用

设置 axis=1 时,concat 函数将沿着列轴合并数据,这通常用于添加新的列。

示例代码 2:横向合并两个 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)
print(result)

Output:

Pandas concat axis 详解

3. 使用 concat 合并具有不同列的 DataFrame

当合并的 DataFrame 拥有不同的列时,concat 函数提供了多种处理方式,如使用 join 参数来指定如何处理不匹配的列。

示例代码 3:合并具有不同列的 DataFrame,使用外连接

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], axis=0, join='outer')
print(result)

Output:

Pandas concat axis 详解

示例代码 4:合并具有不同列的 DataFrame,使用内连接

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], axis=0, join='inner')
print(result)

Output:

Pandas concat axis 详解

4. 使用 keys 参数创建多级索引

在合并多个 DataFrame 时,可以使用 keys 参数为结果 DataFrame 创建多级索引,这有助于保持数据来源的清晰。

示例代码 5:使用 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"]
})

result = pd.concat([df1, df2], axis=0, keys=['df1', 'df2'])
print(result)

Output:

Pandas concat axis 详解

5. 忽略原有索引

在某些情况下,原有的索引可能不再有意义,此时可以使用 ignore_index=True 参数来生成新的整数索引。

示例代码 6:忽略原有索引

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], axis=0, ignore_index=True)
print(result)

Output:

Pandas concat axis 详解

6. 验证数据完整性

使用 verify_integrity=True 参数可以检查合并后的 DataFrame 是否包含重复的索引,这有助于避免数据错误。

示例代码 7:验证数据完整性

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

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

Output:

Pandas concat axis 详解

7. 排序列

在合并时,如果设置 sort=True,Pandas 将对非连接轴的列进行排序。这在某些情况下有助于快速查找数据,但可能会增加额外的计算成本。

示例代码 8:在合并时排序列

import pandas as pd

df1 = pd.DataFrame({
    "A": ["A0", "A1", "A2", "A3"],
    "C": ["C0", "C1", "C2", "C3"]
})

df2 = pd.DataFrame({
    "B": ["B4", "B5", "B6", "B7"],
    "D": ["D4", "D5", "D6", "D7"]
})

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

Output:

Pandas concat axis 详解

8. 复制数据

默认情况下,concat 函数的 copy 参数为 True,这意味着在合并时会创建数据的副本,从而不影响原始数据。如果确定不需要保留原数据,可以设置 copy=False 来提高效率。

示例代码 9:不复制数据

import pandas as pd

df1 = pd.DataFrame({
    "A": ["A0", "A1", "A2", "A3"],
    "B": ["B0", "B1", "B2", "B3"]
})

df2 = pd.DataFrame({
    "C": ["C4", "C5", "C6", "C7"],
    "D": ["D4", "D5", "D6", "D7"]
})

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

Output:

Pandas concat axis 详解

9. 处理多个 DataFrame

在实际应用中,我们可能需要同时合并多个 DataFrame。concat 函数可以接受一个 DataFrame 列表,从而一次性完成多个 DataFrame 的合并。

示例代码 10:合并多个 DataFrame

import pandas as pd

df1 = pd.DataFrame({
    "A": ["A0", "A1", "A2", "A3"],
    "B": ["B0", "B1", "B2", "B3"]
})

df2 = pd.DataFrame({
    "C": ["C4", "C5", "C6", "C7"],
    "D": ["D4", "D5", "D6", "D7"]
})

df3 = pd.DataFrame({
    "E": ["E8", "E9", "E10", "E11"],
    "F": ["F8", "F9", "F10", "F11"]
})

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

Output:

Pandas concat axis 详解

10. 使用场景和实际应用

pandas.concat 是一个非常灵活的工具,可以应用于多种数据合并场景。以下是一些常见的使用场景:

  1. 时间序列数据合并:当你有按日期/时间分开存储的数据时,可以使用 concat 来合并这些数据。
  2. 特征工程:在机器学习的数据准备过程中,经常需要将多个特征集合并到一个大的 DataFrame 中。
  3. 数据清洗:在数据清洗过程中,可能需要从多个来源合并数据,然后统一进行清洗和处理。

示例代码 11:时间序列数据合并

import pandas as pd

# 假设这些 DataFrame 分别代表不同月份的数据
df_jan = pd.DataFrame({
    "date": pd.date_range(start="2023-01-01", periods=31),
    "value": range(31)
})

df_feb = pd.DataFrame({
    "date": pd.date_range(start="2023-02-01", periods=28),
    "value": range(28)
})

result = pd.concat([df_jan, df_feb], axis=0)
print(result)

Output:

Pandas concat axis 详解

通过这些示例,我们可以看到 pandas.concat 在数据处理中的强大功能和灵活性。无论是在数据科学、金融分析还是日常的数据处理任务中,掌握这一工具都将大大提高你的工作效率。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程