pandas数据合并——concat()方法

pandas 库中的 concat() 方法是用于合并多个 DataFrameSeries 对象的一种强大工具。它提供了多种灵活的方式来合并数据,包括按行或按列合并,以及处理索引和列的排序等问题。下面详细介绍 concat() 方法的使用方式和注意事项。

基本语法

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

参数说明

  • objs:
    一个包含需要合并的 DataFrameSeries 对象的列表、元组或字典。例如:[df1, df2, df3]{key1: df1, key2: df2}

  • axis:
    指定合并的轴方向。0'index' 表示按行合并(垂直方向),1'columns' 表示按列合并(水平方向)。

  • join:
    指定合并方式。'outer' 表示全外连接(所有行或列),'inner' 表示内连接(共有部分)。

  • ignore_index:
    布尔值,默认为 False。如果为 True,合并后的新数据框将重新生成索引(即新的数据框将会有从 0 开始的连续索引)。

  • keys:
    用于在合并后的数据框中添加层次化索引。可以是一个列表或元组,例如 ['key1', 'key2']

  • levels:
    用于指定层次化索引的级别,与 keys 参数配合使用。

  • names:
    用于命名层次化索引的名称,与 keyslevels 参数配合使用。

  • verify_integrity:
    布尔值,默认为 False。如果为 True,则在合并过程中会检查是否有重复的索引,如果有重复的索引会抛出异常。

  • sort:
    布尔值,默认为 False。如果为 True,则在合并过程中会对列进行排序。在 pandas 1.3.0 及以后的版本中,这个参数默认为 False,不进行排序。

  • copy:
    布尔值,默认为 True。如果为 False,则避免不必要的复制操作。

示例代码

示例 1:按行合并(垂直方向)
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])

# 按行合并 df1 和 df2
result = pd.concat([df1, df2])

print(result)

输出:

    A   B   C   D
0  A0  B0  C0  D0
1  A1  B1  C1  D1
2  A2  B2  C2  D2
3  A3  B3  C3  D3
4  A4  B4  C4  D4
5  A5  B5  C5  D5
6  A6  B6  C6  D6
7  A7  B7  C7  D7
示例 2:按列合并(水平方向)
# 创建两个 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])

# 按列合并 df1 和 df2
result = pd.concat([df1, df2], axis=1)

print(result)

输出:

    A   B   C   D
0  A0  B0  C0  D0
1  A1  B1  C1  D1
2  A2  B2  C2  D2
3  A3  B3  C3  D3
示例 3:使用 join='inner' 进行内连接
# 创建两个 DataFrame
df1 = pd.DataFrame({
    'A': ['A0', 'A1', 'A2', 'A3'],
    'B': ['B0', 'B1', 'B2', 'B3']
}, index=[0, 1, 2, 3])

df2 = pd.DataFrame({
    'B': ['B4', 'B5', 'B6', 'B7'],
    'C': ['C4', 'C5', 'C6', 'C7']
}, index=[2, 3, 4, 5])

# 按行合并 df1 和 df2,使用内连接
result = pd.concat([df1, df2], join='inner')

print(result)

输出:

    B
2  B2
3  B3
2  B4
3  B5
示例 4:使用 keys 参数添加层次化索引
# 创建两个 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])

# 按行合并 df1 和 df2,并添加层次化索引
result = pd.concat([df1, df2], keys=['df1', 'df2'])

print(result)

输出:

        A   B
df1 0  A0  B0
    1  A1  B1
    2  A2  B2
    3  A3  B3
df2 4  A4  B4
    5  A5  B5
    6  A6  B6
    7  A7  B7

注意事项

  1. 性能问题: concat() 方法会在内存中创建一个新的 DataFrame,因此在大数据量的场景下性能可能较差。如果需要频繁合并数据,建议使用 DataFrame.loc 方法或其他更高效的方法。

  2. 索引处理: 如果不使用 ignore_index=True,合并后的 DataFrame 索引将是原始 DataFrame 索引的组合,可能会导致索引不连续。

  3. 类型匹配: 合并的数据框的列名和数据类型需要与原数据框匹配,否则可能会导致数据缺失或类型转换问题。

  4. 重复索引: 如果 verify_integrity=True,合并过程中会检查是否有重复的索引,防止数据覆盖。

  5. 列的排序: 如果 sort=True,合并后的 DataFrame 的列会按字母顺序排序。

总结

concat() 方法是一个非常灵活且功能强大的数据合并工具,适用于多种合并场景,可以按行或按列合并,支持全外连接、内连接,还可以添加层次化索引。对于大规模数据或频繁合并操作,建议结合其他方法(如 DataFrame.loc)以提高性能。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值