0

0

Pandas DataFrame 高效合并:处理不同长度与值的共同列

DDD

DDD

发布时间:2025-10-13 09:18:16

|

178人浏览过

|

来源于php中文网

原创

Pandas DataFrame 高效合并:处理不同长度与值的共同列

本文详细介绍了如何在 pandas 中高效合并具有共同列但长度和值可能不完全匹配的 dataframes。核心策略是利用 `pd.merge` 函数的 `how='outer'` 参数,它能够实现键的并集,确保所有数据点都被保留,并在非匹配位置自动填充 `nan`,这对于整合多源、非同步的时间序列或观测数据至关重要。

在数据分析和处理中,我们经常需要将来自不同源的数据集合并起来。当这些数据以 Pandas DataFrame 的形式存在,并且它们之间有一个共同的列(例如时间戳、ID 等)作为连接键时,合并操作显得尤为关键。然而,实际情况往往复杂:这些 DataFrames 可能长度不一,共同列的值也可能不完全重合,例如一个 DataFrame 的时间序列采样频率高于另一个。在这种场景下,如何确保数据不丢失,并正确对齐所有信息,是需要解决的核心问题。

理解合并挑战

传统的合并方法,如 DataFrame.append() 或 pd.merge() 的默认参数,在处理这种不对称数据时会遇到局限:

  1. DataFrame.append(): 这种方法仅仅是将一个 DataFrame 的行添加到另一个 DataFrame 的末尾,它不执行任何基于列的对齐操作。如果需要根据共同列进行数据关联,append 无法满足需求。
  2. pd.merge(how='inner'): 内连接(inner join)只保留在两个 DataFrame 的共同列中都存在的行。这意味着任何只存在于其中一个 DataFrame 的数据都会被丢弃。
  3. pd.merge(how='left') 或 pd.merge(how='right'): 左连接(left join)会保留左侧 DataFrame 的所有行,并尝试匹配右侧 DataFrame 的行;右连接(right join)则相反。如果右侧(或左侧)DataFrame 中有左侧(或右侧)没有的键,这些数据同样会被忽略。

上述方法在共同列值不完全重合时,都可能导致重要数据丢失。例如,在分析多个传感器数据时,每个传感器可能以不同的频率记录数据,或者在不同时间段内运行。我们希望将所有传感器的数据整合到一个统一的时间轴上,并用 NaN 填充缺失值,而不是丢弃任何观测数据。

解决方案:外连接(Outer Join)

为了解决上述问题,Pandas 提供了强大的 pd.merge() 函数,并允许通过 how 参数指定不同的连接类型。对于需要保留所有数据点,并对齐共同列的场景,外连接(how='outer')是理想的选择。

当使用 how='outer' 进行合并时,pd.merge() 会执行以下操作:

花生AI
花生AI

B站推出的AI视频创作工具

下载
  • 取键的并集: 它会找出所有在两个 DataFrame 的共同列中出现的唯一值,并将这些值作为结果 DataFrame 的索引或连接键。
  • 填充缺失值: 对于某个 DataFrame 中不存在的键,在结果 DataFrame 中对应的列位置上,会自动填充 NaN(Not a Number)。这样既保留了所有数据,又清晰地标记了哪些数据点在原始 DataFrame 中是缺失的。

这种方法确保了数据的完整性,并为后续的数据清洗、插值或分析提供了统一的视图。

示例代码

让我们通过一个具体的例子来演示如何使用外连接合并两个具有不同长度和值的 DataFrame。假设我们有两个 DataFrame,df1 包含 time 和 data1,df2 包含 time 和 data3。它们的 time 列有部分重叠,但也有各自独有的时间戳。

import pandas as pd

# 模拟第一个 DataFrame
# df1 的时间点:100.5, 100.7, 100.9, 101.1
data1 = {
    'time': [100.5, 100.7, 100.9, 101.1],
    'data1': [0, 0, 1, 1]
}
df1 = pd.DataFrame(data1)

print("DataFrame 1:")
print(df1)
# 输出:
# DataFrame 1:
#     time  data1
# 0  100.5      0
# 1  100.7      0
# 2  100.9      1
# 3  101.1      1

# 模拟第二个 DataFrame
# df2 的时间点:100.5, 100.6, 100.7, 100.8, 100.9, 101.0
data2 = {
    'time': [100.5, 100.6, 100.7, 100.8, 100.9, 101.0],
    'data3': [1, 1, 1, 1, 2, 2]
}
df2 = pd.DataFrame(data2)

print("\nDataFrame 2:")
print(df2)
# 输出:
# DataFrame 2:
#     time  data3
# 0  100.5      1
# 1  100.6      1
# 2  100.7      1
# 3  100.8      1
# 4  100.9      2
# 5  101.0      2

# 使用 outer join 合并 DataFrames
# 'on' 参数指定了用于合并的共同列
# 'how="outer"' 指定了执行外连接
merged_df = pd.merge(df1, df2, on='time', how='outer')

print("\n合并后的 DataFrame (Outer Join):")
print(merged_df)
# 预期输出:
# 合并后的 DataFrame (Outer Join):
#     time  data1  data3
# 0  100.5    0.0    1.0
# 1  100.7    0.0    1.0
# 2  100.9    1.0    2.0
# 3  101.1    1.0    NaN
# 4  100.6    NaN    1.0
# 5  100.8    NaN    1.0
# 6  101.0    NaN    2.0

从输出结果可以看到:

  • time 列包含了 df1 和 df2 中所有独一无二的时间点(100.5, 100.6, 100.7, 100.8, 100.9, 101.0, 101.1),是它们的并集。
  • 对于 time=101.1,df1 中有 data1=1,而 df2 中没有对应的时间点,所以在 data3 列填充了 NaN。
  • 对于 time=100.6, 100.8, 101.0,df2 中有 data3 值,而 df1 中没有对应的时间点,所以在 data1 列填充了 NaN。
  • 共同的时间点(如 100.5, 100.7, 100.9)的数据则被正确地匹配和合并。

注意事项与最佳实践

  1. 明确指定 on 参数: 始终明确地使用 on 参数指定用于合并的共同列。如果两个 DataFrame 中有多个同名列,Pandas 会尝试推断,但这可能不是你想要的结果。如果共同列在两个 DataFrame 中名称不同,可以使用 left_on 和 right_on 参数。
  2. 处理 NaN 值: 合并后产生的 NaN 值表示原始数据中的缺失。根据后续分析需求,你可能需要对这些 NaN 值进行处理:
    • 填充: 使用 fillna() 方法用一个常数(如0)、前一个有效值(ffill)或后一个有效值(bfill)进行填充,或者使用插值方法(如 interpolate())。
    • 删除: 如果缺失值过多且无法有效填充,可以使用 dropna() 方法删除包含 NaN 的行或列。
  3. 性能考虑: 对于非常大的 DataFrames,合并操作可能消耗较多内存和计算资源。在执行合并前,确保共同列的数据类型一致,可以提高效率。对于时间序列数据,将 time 列设置为 DataFrame 的索引,然后使用 pd.concat() 或 DataFrame.join() 可能是更高效的替代方案。
  4. 理解其他连接类型: 虽然本文重点介绍外连接,但理解 inner、left 和 right 连接的用途同样重要。选择哪种连接类型取决于你希望如何处理非匹配数据。

总结

当面临合并具有共同列但长度和值不完全相同的 Pandas DataFrames 时,pd.merge() 函数配合 how='outer' 参数是确保数据完整性、避免信息丢失的有效策略。它通过创建连接键的并集并填充 NaN 值,为后续的数据分析提供了一个全面且对齐的数据视图。掌握这一技巧对于处理复杂的、多源的数据集成任务至关重要。

相关专题

更多
Python 时间序列分析与预测
Python 时间序列分析与预测

本专题专注讲解 Python 在时间序列数据处理与预测建模中的实战技巧,涵盖时间索引处理、周期性与趋势分解、平稳性检测、ARIMA/SARIMA 模型构建、预测误差评估,以及基于实际业务场景的时间序列项目实操,帮助学习者掌握从数据预处理到模型预测的完整时序分析能力。

51

2025.12.04

数据类型有哪几种
数据类型有哪几种

数据类型有整型、浮点型、字符型、字符串型、布尔型、数组、结构体和枚举等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

303

2023.10.31

php数据类型
php数据类型

本专题整合了php数据类型相关内容,阅读专题下面的文章了解更多详细内容。

222

2025.10.31

append用法
append用法

append是一个常用的命令行工具,用于将一个文件的内容追加到另一个文件的末尾。想了解更多append用法相关内容,可以阅读本专题下面的文章。

343

2023.10.25

python中append的用法
python中append的用法

在Python中,append()是列表对象的一个方法,用于向列表末尾添加一个元素。想了解更多append的更多内容,可以阅读本专题下面的文章。

1073

2023.11.14

python中append的含义
python中append的含义

本专题整合了python中append的相关内容,阅读专题下面的文章了解更多详细内容。

175

2025.09.12

数据分析的方法
数据分析的方法

数据分析的方法有:对比分析法,分组分析法,预测分析法,漏斗分析法,AB测试分析法,象限分析法,公式拆解法,可行域分析法,二八分析法,假设性分析法。php中文网为大家带来了数据分析的相关知识、以及相关文章等内容。

465

2023.07.04

数据分析方法有哪几种
数据分析方法有哪几种

数据分析方法有:1、描述性统计分析;2、探索性数据分析;3、假设检验;4、回归分析;5、聚类分析。本专题为大家提供数据分析方法的相关的文章、下载、课程内容,供大家免费下载体验。

279

2023.08.07

高德地图升级方法汇总
高德地图升级方法汇总

本专题整合了高德地图升级相关教程,阅读专题下面的文章了解更多详细内容。

72

2026.01.16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Java 教程
Java 教程

共578课时 | 47.6万人学习

国外Web开发全栈课程全集
国外Web开发全栈课程全集

共12课时 | 1.0万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号