Pandas DataFrame数据合并与连接的完整指南

 更新时间:2026年02月24日 08:28:30   作者:detayun  
在数据分析工作中,我们经常需要处理来自多个来源的数据,将这些分散的数据集整合成一个统一的结构是分析前的关键步骤,本文将系统介绍Pandas中DataFrame合并与连接的核心技术,帮助你掌握数据整合的艺术,需要的朋友可以参考下

引言

在数据分析工作中,我们经常需要处理来自多个来源的数据。将这些分散的数据集整合成一个统一的结构是分析前的关键步骤。Pandas库提供了多种强大的数据合并与连接方法,能够高效处理各种数据整合场景。本文将系统介绍Pandas中DataFrame合并与连接的核心技术,帮助你掌握数据整合的艺术。

一、合并基础:concat()方法

1.1 基本纵向合并(堆叠)

concat()是最基础的数据合并方法,默认沿轴0(行方向)合并:

import pandas as pd

# 创建示例DataFrame
df1 = pd.DataFrame({'A': ['A0', 'A1'], 'B': ['B0', 'B1']})
df2 = pd.DataFrame({'A': ['A2', 'A3'], 'B': ['B2', 'B3']})

# 纵向合并(堆叠)
result = pd.concat([df1, df2], axis=0)
print(result)

1.2 基本横向合并(并排)

设置axis=1可实现横向合并:

df3 = pd.DataFrame({'C': ['C0', 'C1']})
df4 = pd.DataFrame({'D': ['D0', 'D1']})

# 横向合并
result = pd.concat([df3, df4], axis=1)
print(result)

1.3 处理索引问题

合并后常出现重复索引,可通过以下参数控制:

# 忽略原索引,创建新数字索引
result = pd.concat([df1, df2], ignore_index=True)

# 保留原索引并添加多级索引
result = pd.concat([df1, df2], keys=['df1', 'df2'])
print(result)

二、数据库风格的连接:merge()方法

2.1 基本内连接(INNER JOIN)

merge()是Pandas中最强大的连接方法,类似于SQL中的JOIN操作:

# 创建示例DataFrame
left = pd.DataFrame({'key': ['K0', 'K1', 'K2'], 'A': ['A0', 'A1', 'A2']})
right = pd.DataFrame({'key': ['K0', 'K1', 'K3'], 'B': ['B0', 'B1', 'B2']})

# 内连接(默认)
result = pd.merge(left, right, on='key')
print(result)

2.2 不同连接类型

Pandas支持所有标准SQL连接类型:

# 左连接(保留左表所有记录)
left_join = pd.merge(left, right, on='key', how='left')

# 右连接(保留右表所有记录)
right_join = pd.merge(left, right, on='key', how='right')

# 外连接(保留所有记录)
outer_join = pd.merge(left, right, on='key', how='outer')

2.3 多键连接

可以基于多个列进行连接:

left_multi = pd.DataFrame({
    'key1': ['K0', 'K0', 'K1'],
    'key2': ['K0', 'K1', 'K0'],
    'A': ['A0', 'A1', 'A2']
})

right_multi = pd.DataFrame({
    'key1': ['K0', 'K1'],
    'key2': ['K0', 'K0'],
    'B': ['B0', 'B1']
})

result = pd.merge(left_multi, right_multi, on=['key1', 'key2'])

2.4 处理列名冲突

当连接列名相同时,Pandas会自动添加后缀:

# 自定义后缀
result = pd.merge(left, right, on='key', suffixes=('_left', '_right'))

三、基于索引的连接:join()方法

3.1 基本索引连接

join()merge()的简化版,专门用于基于索引的连接:

# 创建示例DataFrame
df1 = pd.DataFrame({'A': ['A0', 'A1']}, index=['K0', 'K1'])
df2 = pd.DataFrame({'B': ['B0', 'B1']}, index=['K0', 'K2'])

# 左连接(默认)
result = df1.join(df2, how='left')
print(result)

3.2 多DataFrame连接

可以一次性连接多个DataFrame:

df3 = pd.DataFrame({'C': ['C0', 'C1']}, index=['K0', 'K2'])
result = df1.join([df2, df3], how='outer')

四、高级合并技巧

4.1 合并时添加指示器列

可以添加一列显示记录来源:

result = pd.merge(left, right, on='key', how='outer', indicator=True)
print(result)

4.2 合并不同数据类型

Pandas会自动对齐数据类型,但有时需要手动转换:

left['key'] = left['key'].astype(str)  # 转换为字符串类型
right['key'] = right['key'].astype(str)
result = pd.merge(left, right, on='key')

4.3 合并时更新值

使用update()方法用右表更新左表中的值:

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

df1.update(df2)  # 只更新匹配的行和列
print(df1)

4.4 合并时应用函数

可以在合并时对重叠列应用函数:

from pandas.api.types import CategoricalDtype

# 自定义合并函数
def merge_with_func(left, right):
    return left + '_' + right  # 示例:字符串连接

# 创建示例
df1 = pd.DataFrame({'key': ['K0', 'K1'], 'val': ['A', 'B']})
df2 = pd.DataFrame({'key': ['K0', 'K1'], 'val': ['1', '2']})

# 先合并再应用函数(实际中可能需要更复杂的处理)
result = pd.merge(df1, df2, on='key')
result['combined'] = result['val_x'] + '_' + result['val_y']

五、性能优化技巧

5.1 使用category类型优化合并

对于低基数列,转换为category类型可以提高合并速度:

df1['key'] = df1['key'].astype('category')
df2['key'] = df2['key'].astype('category')

5.2 预先排序提高合并效率

对连接键预先排序可以显著提高大数据集的合并速度:

df1 = df1.sort_values('key')
df2 = df2.sort_values('key')

5.3 使用Dask处理超大数据集

对于超出内存的数据集,可以使用Dask库:

import dask.dataframe as dd

ddf1 = dd.from_pandas(df1, npartitions=2)
ddf2 = dd.from_pandas(df2, npartitions=2)
result = dd.merge(ddf1, ddf2, on='key').compute()

六、实际应用案例

案例1:整合销售数据

# 订单数据
orders = pd.DataFrame({
    'order_id': [1, 2, 3],
    'customer_id': [101, 102, 103],
    'amount': [100, 200, 150]
})

# 客户数据
customers = pd.DataFrame({
    'customer_id': [101, 102, 104],
    'name': ['Alice', 'Bob', 'Charlie'],
    'segment': ['A', 'B', 'C']
})

# 左连接获取完整订单信息(包括未匹配的客户)
order_details = pd.merge(
    orders, 
    customers, 
    on='customer_id', 
    how='left'
)
print(order_details)

案例2:时间序列数据对齐

# 创建两个时间序列数据集(时间不完全对齐)
dates1 = pd.date_range('2023-01-01', periods=5)
dates2 = pd.date_range('2023-01-03', periods=5)

df_temp = pd.DataFrame({'date': dates1, 'temp': [20, 21, 22, 23, 24]})
df_rain = pd.DataFrame({'date': dates2, 'rain': [0.1, 0.2, 0.0, 0.3, 0.1]})

# 外连接并对齐日期
weather_data = pd.merge(
    df_temp, 
    df_rain, 
    on='date', 
    how='outer'
).sort_values('date')
print(weather_data)

案例3:多源数据整合

# 员工基本信息
employees = pd.DataFrame({
    'emp_id': [1, 2, 3],
    'name': ['Alice', 'Bob', 'Charlie'],
    'dept': ['HR', 'IT', 'Finance']
})

# 薪资数据
salaries = pd.DataFrame({
    'emp_id': [1, 2, 4],  # 注意有员工4不在基本信息中
    'salary': [50000, 80000, 70000]
})

# 部门信息
departments = pd.DataFrame({
    'dept': ['HR', 'IT', 'Finance'],
    'location': ['Building A', 'Building B', 'Building C']
})

# 多步合并:先合并员工和薪资,再合并部门信息
step1 = pd.merge(employees, salaries, on='emp_id', how='outer')
result = pd.merge(step1, departments, on='dept', how='left')
print(result)

七、常见问题解决

问题1:合并后出现重复列

# 使用suffixes参数处理
result = pd.merge(df1, df2, on='key', suffixes=('_left', '_right'))

问题2:合并后数据量异常

检查连接类型是否正确:

# 确认连接类型
print(f"左表行数: {len(left)}")
print(f"右表行数: {len(right)}")
print(f"内连接结果: {len(pd.merge(left, right, on='key', how='inner'))}")

问题3:合并时数据类型不匹配

# 检查并转换数据类型
print(left['key'].dtype)
print(right['key'].dtype)

# 统一转换为字符串
left['key'] = left['key'].astype(str)
right['key'] = right['key'].astype(str)

问题4:处理大型合并时的内存问题

# 分块处理大型合并
chunk_size = 100000
results = []

for i in range(0, len(df1), chunk_size):
    chunk = pd.merge(
        df1.iloc[i:i+chunk_size],
        df2,
        on='key'
    )
    results.append(chunk)

final_result = pd.concat(results, ignore_index=True)

总结

DataFrame的合并与连接是数据分析中不可或缺的技能,掌握它们可以让你:

  1. 高效整合来自不同来源的数据
  2. 构建适合分析的完整数据集
  3. 处理数据对齐和匹配问题
  4. 优化大数据集的处理性能

本文介绍了从基础到高级的合并连接技术,包括concat()merge()join()等核心方法,以及各种实际应用场景和性能优化技巧。记住,选择哪种合并方法取决于你的具体需求:

  • 需要简单堆叠数据?使用concat()
  • 需要基于键的复杂连接?使用merge()
  • 需要基于索引的快速连接?使用join()

通过实践这些技术,你将能够轻松应对各种数据整合挑战,为后续的数据分析和可视化奠定坚实基础。

以上就是Pandas DataFrame数据合并与连接的完整指南的详细内容,更多关于Pandas DataFrame数据合并与连接的资料请关注脚本之家其它相关文章!

相关文章

  • 详细过程带你用Python做车牌自动识别系统

    详细过程带你用Python做车牌自动识别系统

    这篇文章主要介绍了带你用Python做车牌自动识别系统的详细过程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-08-08
  • Python如何向IP地址发送字符串

    Python如何向IP地址发送字符串

    在Python中,向IP地址发送字符串通常意味着你需要通过某种协议来实现通信,最常见的协议包括TCP和UDP,这篇文章主要介绍了Python向IP地址发送字符串的示例代码,需要的朋友可以参考下
    2024-08-08
  • Python实现八皇后问题示例代码

    Python实现八皇后问题示例代码

    这篇文章主要给大家介绍了关于利用Python实现八皇后问题的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-12-12
  • Python cookie的保存与读取、SSL讲解

    Python cookie的保存与读取、SSL讲解

    在本篇文章里小编给大家整理了关于Python cookie的保存与读取、SSL讲解,需要的朋友们可以学习下。
    2020-02-02
  • Python面向对象三大特征:继承、封装和多态的深度解析

    Python面向对象三大特征:继承、封装和多态的深度解析

    在面向对象程序设计中,对象可以看做是数据(特性)以及由一系列可以存取、操作这些数据的方法所组成的集合,Python是面向对象的语言,支持面向对象编程的三大特性:继承、封装(隐藏)、多态,本文将逐一讲解Python的三大特性
    2025-01-01
  • python实现多个视频文件合成画中画效果

    python实现多个视频文件合成画中画效果

    这篇文章主要为大家详细介绍了python实现多个视频文件合成画中画效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-08-08
  • pycharm如何关闭pytest

    pycharm如何关闭pytest

    这篇文章主要介绍了pycharm如何关闭pytest问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01
  • python实现查找两个字符串中相同字符并输出的方法

    python实现查找两个字符串中相同字符并输出的方法

    这篇文章主要介绍了python实现查找两个字符串中相同字符并输出的方法,涉及Python针对字符串操作的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-07-07
  • 解决pytorch 交叉熵损失输出为负数的问题

    解决pytorch 交叉熵损失输出为负数的问题

    这篇文章主要介绍了解决pytorch 交叉熵损失输出为负数的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-07-07
  • Django 多表关联 存储 使用方法详解 ManyToManyField save

    Django 多表关联 存储 使用方法详解 ManyToManyField save

    今天小编就为大家分享一篇Django 多表关联 存储 使用方法详解 ManyToManyField save,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-08-08

最新评论