掌握 Pandas Concat:数据科学中的连接操作 – wiki大全

掌握 Pandas Concat:数据科学中的连接操作

在数据科学和数据分析的领域中,数据的收集和整合是日常任务。Pandas 库作为 Python 中最强大的数据处理工具之一,提供了多种灵活的方法来组合数据集。其中,pd.concat() 函数是实现数据连接操作的基石,它允许我们沿轴堆叠或连接 DataFrame 或 Series 对象。

本文将深入探讨 pd.concat() 的用法、核心参数以及在不同场景下的应用,帮助您充分掌握这一强大的数据整合工具。

什么是 pd.concat()

pd.concat() 函数用于沿着特定轴(行或列)简单地连接 Pandas 对象。与 SQL 风格的 mergejoin 操作不同,concat 主要是基于轴的连接,而不是基于键的合并。它将多个 DataFrame 或 Series “堆叠”在一起。

核心参数:

  • objs: 必须是 Series 或 DataFrame 对象的序列或映射。这是您想要连接的数据。
  • axis: 指定连接轴。0 表示沿索引(行)连接,1 表示沿列连接。默认值为 0
  • join: 指定如何处理其他轴上的索引。'outer' 表示取所有索引的并集(默认),'inner' 表示取所有索引的交集。
  • ignore_index: 如果为 True,则在连接轴上不使用原始索引,而是生成一个新的从 0n-1 的整数索引。当您不关心原始索引的重复或不一致时非常有用。
  • keys: 使用此参数可以为连接后的每个原始 DataFrame 或 Series 创建一个分层索引(MultiIndex),这对于识别数据来源非常有用。
  • names: 与 keys 一起使用时,为生成的 MultiIndex 的层命名。

1. 基本连接:按行堆叠 (axis=0)

这是 pd.concat() 最常见的用法,用于将具有相同或相似列结构的 DataFrame 按行堆叠在一起。

“`python
import pandas as pd

创建两个 DataFrame

df1 = pd.DataFrame({‘A’: [‘A0’, ‘A1’, ‘A2’],
‘B’: [‘B0’, ‘B1’, ‘B2’]},
index=[0, 1, 2])

df2 = pd.DataFrame({‘A’: [‘A3’, ‘A4’, ‘A5’],
‘B’: [‘B3’, ‘B4’, ‘B5’]},
index=[3, 4, 5])

print(“df1:\n”, df1)
print(“\ndf2:\n”, df2)

按行连接 (axis=0 是默认值)

result_rows = pd.concat([df1, df2])
print(“\n按行连接结果 (result_rows):\n”, result_rows)
“`

输出解释: 您会注意到 result_rows 保留了原始的索引。

2. 处理重复索引:ignore_index=True

当按行连接时,如果原始 DataFrame 的索引有重复,或者您不希望保留原始索引,可以使用 ignore_index=True 来生成一个全新的、从零开始的整数索引。

“`python
df3 = pd.DataFrame({‘A’: [‘A6’, ‘A7’],
‘B’: [‘B6’, ‘B7’]},
index=[0, 1]) # 索引与 df1 重复

print(“\ndf3:\n”, df3)

按行连接并忽略原始索引

result_ignore_index = pd.concat([df1, df3], ignore_index=True)
print(“\n忽略索引按行连接结果 (result_ignore_index):\n”, result_ignore_index)
“`

3. 按列连接 (axis=1)

当您想将具有相同或相似索引的 DataFrame 按列连接时,可以使用 axis=1。这类似于 SQL 中的 JOIN 操作,但默认是基于索引的。

“`python
df4 = pd.DataFrame({‘C’: [‘C0’, ‘C1’, ‘C2’],
‘D’: [‘D0’, ‘D1’, ‘D2’]},
index=[0, 1, 2])

print(“\ndf4:\n”, df4)

按列连接

result_cols = pd.concat([df1, df4], axis=1)
print(“\n按列连接结果 (result_cols):\n”, result_cols)
“`

4. 处理不匹配的列/索引:join 参数

当连接的 DataFrame 在非连接轴上(即 axis=0 时是列,axis=1 时是行)存在不匹配的标签时,join 参数就派上用场了。

  • join='outer' (默认):保留所有列/行,缺失值用 NaN 填充。
  • join='inner':只保留所有 DataFrame 共有 的列/行。

示例 1:按行连接,列不完全匹配

“`python
df5 = pd.DataFrame({‘A’: [‘A8’, ‘A9’],
‘C’: [‘C8’, ‘C9’], # 新增列 ‘C’
‘E’: [‘E8’, ‘E9’]}, # 新增列 ‘E’
index=[8, 9])

print(“\ndf5:\n”, df5)

默认 outer join

result_outer_join = pd.concat([df1, df5], ignore_index=True)
print(“\nOuter Join (默认) 按行连接结果:\n”, result_outer_join)

Inner join

result_inner_join = pd.concat([df1, df5], join=’inner’, ignore_index=True)
print(“\nInner Join 按行连接结果:\n”, result_inner_join)
“`

示例 2:按列连接,行索引不完全匹配

“`python
df6 = pd.DataFrame({‘E’: [‘E0’, ‘E1’, ‘E2’],
‘F’: [‘F0’, ‘F1’, ‘F2’]},
index=[0, 2, 3]) # 索引与 df1 不完全匹配

print(“\ndf6:\n”, df6)

默认 outer join

result_outer_cols = pd.concat([df1, df6], axis=1, join=’outer’)
print(“\nOuter Join (默认) 按列连接结果:\n”, result_outer_cols)

Inner join

result_inner_cols = pd.concat([df1, df6], axis=1, join=’inner’)
print(“\nInner Join 按列连接结果:\n”, result_inner_cols)
“`

5. 使用 keys 参数创建分层索引 (MultiIndex)

当您连接多个 DataFrame 并且希望在结果中保留数据来源信息时,keys 参数非常有用。它会在连接轴上创建一个额外的索引级别。

“`python
result_keys = pd.concat([df1, df2], keys=[‘df1_source’, ‘df2_source’])
print(“\n使用 keys 参数连接结果 (result_keys):\n”, result_keys)

您可以通过 MultiIndex 访问特定来源的数据

print(“\n从 result_keys 中获取 df1_source 的数据:\n”, result_keys.loc[‘df1_source’])
“`

6. 连接 Series 对象

pd.concat() 同样可以用于连接 Series 对象,其行为与 DataFrame 类似。

“`python
s1 = pd.Series([0, 1, 2], name=’col_s1′)
s2 = pd.Series([3, 4, 5], name=’col_s2′)

print(“\ns1:\n”, s1)
print(“\ns2:\n”, s2)

连接 Series (按行,结果是 Series)

concat_series_rows = pd.concat([s1, s2])
print(“\n按行连接 Series (concat_series_rows):\n”, concat_series_rows)

连接 Series (按列,结果是 DataFrame)

concat_series_cols = pd.concat([s1, s2], axis=1)
print(“\n按列连接 Series (concat_series_cols):\n”, concat_series_cols)
“`

concat vs. merge / join:何时选择?

理解 pd.concat()pd.merge()(或 DataFrame 的 .join() 方法)之间的区别至关重要。

  • pd.concat():

    • 用途:主要用于沿轴“堆叠”或“粘合”数据。
    • 基础:基于轴(行或列)的简单连接。
    • 场景:当您有多个具有相同列名但来自不同时间点或不同来源的数据集,想将它们按行堆叠时;或者您想将两个具有相同索引的数据集按列并排放置时。
  • pd.merge() / .join():

    • 用途:主要用于基于一个或多个键(列)将不同 DataFrame 中的信息组合起来。
    • 基础:基于共同的列(键)或索引的 SQL 风格的合并。
    • 场景:当您有两个 DataFrame,它们通过一个共同的标识符(如用户 ID、订单 ID)关联,并且您想根据这些标识符将它们的列合并在一起时。

简而言之,concat 是用于连接(或堆叠)数据,而 merge/join 是用于合并(或关联)数据。

结论

pd.concat() 是 Pandas 中一个极其灵活和强大的数据组合工具。无论是简单地按行堆叠数据,还是复杂地按列连接并处理索引不匹配,亦或是利用 keys 参数进行分层索引,它都能满足您在数据预处理阶段的各种需求。通过熟练掌握 pd.concat() 及其参数,您将能够更高效、更优雅地处理和整合复杂的数据集,为后续的数据分析和建模奠定坚实的基础。

滚动至顶部