Pandas Concat教程:轻松掌握数据拼接技巧 – wiki基地

Pandas Concat 教程:轻松掌握数据拼接技巧

在数据分析和处理过程中,经常需要将来自不同来源的数据合并到一起。Pandas 提供了一个强大的工具 concat,可以灵活高效地完成各种数据拼接任务。本文将深入探讨 concat 函数的用法,涵盖各种场景和高级技巧,助你轻松掌握数据拼接的艺术。

1. concat 函数基础

pandas.concat 函数可以沿着指定的轴(axis)将 Series 或 DataFrame 对象连接起来。其基本语法如下:

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

主要参数解释:

  • objs: 要连接的 Series 或 DataFrame 对象序列,可以是列表、元组或字典。
  • axis: 连接的轴向,0 表示沿着行(index)连接,1 表示沿着列(columns)连接。默认为 0。
  • join: 连接方式,’inner’ 表示取交集,’outer’ 表示取并集。默认为 ‘outer’。
  • ignore_index: 是否忽略原始索引,True 表示重新生成索引,False 表示保留原始索引。默认为 False。
  • keys: 为连接后的数据添加多级索引,用于区分不同的数据来源。
  • levels: 指定多级索引的级别。
  • names: 为多级索引的级别命名。
  • verify_integrity: 检查连接后是否有重复的索引,True 表示检查,False 表示不检查。默认为 False。
  • sort: 对连接后的列名进行排序,True 表示排序,False 表示不排序。默认为 False (Pandas 1.3.0 之后)。
  • copy: 是否复制数据,True 表示复制,False 表示不复制。默认为 True。

2. 连接 Series

连接 Series 对象类似于列表的拼接。

“`python
import pandas as pd

s1 = pd.Series([1, 2, 3], name=’s1′)
s2 = pd.Series([4, 5, 6], name=’s2′)

沿着行连接

result = pd.concat([s1, s2])
print(result)

沿着列连接

result = pd.concat([s1, s2], axis=1)
print(result)

使用 keys 添加多级索引

result = pd.concat([s1, s2], keys=[‘A’, ‘B’])
print(result)
“`

3. 连接 DataFrame

连接 DataFrame 对象更加灵活,可以沿着行或列进行连接。

“`python
import pandas as pd

df1 = pd.DataFrame({‘A’: [1, 2], ‘B’: [3, 4]})
df2 = pd.DataFrame({‘A’: [5, 6], ‘B’: [7, 8]})

沿着行连接

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

沿着列连接

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

使用 ignore_index 重新生成索引

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

使用 keys 添加多级索引

result = pd.concat([df1, df2], keys=[‘X’, ‘Y’])
print(result)
“`

4. 不同列名的 DataFrame 连接

当连接的 DataFrame 列名不同时,concat 会自动补全缺失值。

“`python
import pandas as pd

df1 = pd.DataFrame({‘A’: [1, 2], ‘B’: [3, 4]})
df2 = pd.DataFrame({‘C’: [5, 6], ‘D’: [7, 8]})

沿着行连接,缺失值用 NaN 填充

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

沿着列连接

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

使用 join=’inner’ 只保留共同的列

result = pd.concat([df1, df2], join=’inner’) # 空 DataFrame,因为没有共同列
print(result)

df3 = pd.DataFrame({‘A’: [5, 6], ‘C’: [7, 8]})
result = pd.concat([df1, df3], join=’inner’) # 只保留 ‘A’ 列
print(result)
“`

5. 使用 append 方法

append 方法是 concat 的简化版本,用于将一个对象添加到另一个对象的末尾。

“`python
import pandas as pd

df1 = pd.DataFrame({‘A’: [1, 2], ‘B’: [3, 4]})
df2 = pd.DataFrame({‘A’: [5, 6], ‘B’: [7, 8]})

result = df1.append(df2, ignore_index=True)
print(result)

append 多个 DataFrame

result = df1.append([df2, df2], ignore_index=True)
print(result)

注意:append 方法已被弃用,建议使用 concat

“`

6. 处理重复索引

当连接的 DataFrame 存在重复索引时,verify_integrity=True 可以用于检查并抛出异常。

“`python
import pandas as pd

df1 = pd.DataFrame({‘A’: [1, 2], ‘B’: [3, 4]}, index=[0, 1])
df2 = pd.DataFrame({‘A’: [5, 6], ‘B’: [7, 8]}, index=[0, 1])

允许重复索引

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

检查重复索引并抛出异常

try:
result = pd.concat([df1, df2], verify_integrity=True)
except ValueError as e:
print(e) # ValueError: Indexes have overlapping values: Int64Index([0, 1], dtype=’int64′)
“`

7. 高级用法:多级索引和分层数据

keys, levelsnames 参数可以用于创建复杂的多级索引,方便管理和访问数据。

“`python
import pandas as pd

df1 = pd.DataFrame({‘A’: [1, 2], ‘B’: [3, 4]})
df2 = pd.DataFrame({‘A’: [5, 6], ‘B’: [7, 8]})

创建多级索引

result = pd.concat([df1, df2], keys=[‘Group1’, ‘Group2’], names=[‘Group’, ‘Index’])
print(result)

访问特定组的数据

print(result.loc[‘Group1’])
“`

8. 性能优化

在处理大量数据时,concat 的性能可能会成为瓶颈。以下是一些优化技巧:

  • 尽可能避免使用 append 方法,因为它会反复创建新的对象。
  • 使用 ignore_index=True 可以避免索引的调整,提高性能。
  • 如果不需要检查重复索引,可以设置 verify_integrity=False
  • 如果数据量非常大,可以考虑使用其他工具,例如 daskvaex

总结

pandas.concat 是一个功能强大的数据拼接工具,可以灵活处理各种场景。 通过理解其参数和用法,你可以高效地组合不同来源的数据,为后续的数据分析和处理奠定基础. 本文详细介绍了 concat 的各种用法,包括连接 Series 和 DataFrame、处理不同列名和重复索引、以及高级的多级索引操作. 希望本文能帮助你更好地掌握 concat 函数,提升你的数据处理技能.

发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注

滚动至顶部