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
, levels
和 names
参数可以用于创建复杂的多级索引,方便管理和访问数据。
“`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
。 - 如果数据量非常大,可以考虑使用其他工具,例如
dask
或vaex
。
总结
pandas.concat
是一个功能强大的数据拼接工具,可以灵活处理各种场景。 通过理解其参数和用法,你可以高效地组合不同来源的数据,为后续的数据分析和处理奠定基础. 本文详细介绍了 concat
的各种用法,包括连接 Series 和 DataFrame、处理不同列名和重复索引、以及高级的多级索引操作. 希望本文能帮助你更好地掌握 concat
函数,提升你的数据处理技能.