0

0

Pandas DataFrame差异识别与来源追溯教程

聖光之護

聖光之護

发布时间:2025-08-31 11:55:01

|

218人浏览过

|

来源于php中文网

原创

pandas dataframe差异识别与来源追溯教程

本教程详细介绍了如何使用Pandas库高效比较两个DataFrame,识别出它们之间的差异行,并明确这些差异行来源于哪个原始DataFrame。我们将利用pd.merge函数的indicator=True参数来自动生成来源标识,并进一步探讨在合并过程中如何保留并追踪原始DataFrame的行索引,从而实现更精细的数据差异分析。

识别DataFrame差异行及其来源

在数据分析中,经常需要比较两个结构相似但内容可能存在差异的DataFrame,例如比较当前估算与历史估算数据。Pandas提供了强大的合并(merge)功能,结合特定的参数,可以轻松实现这一目标。

核心方法是使用pd.merge函数,并设置how='outer'和indicator=True。

  • how='outer':执行外连接,这意味着它会保留两个DataFrame中所有不匹配的行,以及匹配的行。
  • indicator=True:这个参数是关键,它会在结果DataFrame中添加一个名为_merge的特殊列。这个列会指示每一行来源于哪个原始DataFrame:
    • left_only:该行仅存在于左侧DataFrame(合并时传入的第一个DataFrame)。
    • right_only:该行仅存在于右侧DataFrame(合并时传入的第二个DataFrame)。
    • both:该行在两个DataFrame中都存在且匹配。

通过筛选_merge列不为'both'的行,我们就能得到所有存在差异的行。

示例代码:识别差异行并标注来源

假设我们有两个DataFrame,df_current_est代表当前估算,df_previous_est代表历史估算。

Musico
Musico

Musico 是一个AI驱动的软件引擎,可以生成音乐。 它可以对手势、动作、代码或其他声音做出反应。

下载
import pandas as pd

# 模拟数据
df_current_est = pd.DataFrame({
    'EstimateID': [10061, 10062, 10063],
    'Season': [2023, 2023, 2023],
    'RPIN': ['R1000', 'R2000', 'R3000'],
    'GrowMethodCode': ['FO', 'FO', 'FO'],
    'Variety_code': ['002', '068', '001'],
    'Packout_pc': [0.60, 0.76, 0.80],
    'QtyBins': [320, 1000, 500]
})

df_previous_est = pd.DataFrame({
    'EstimateID': [10061, 10062, 10064],
    'Season': [2023, 2023, 2023],
    'RPIN': ['R1000', 'R2000', 'R4000'],
    'GrowMethodCode': ['FO', 'FO', 'FO'],
    'Variety_code': ['002', '068', '003'],
    'Packout_pc': [0.60, 0.76, 0.90],
    'QtyBins': [9000, 90000, 600]
})

print("df_current_est:")
print(df_current_est)
print("\ndf_previous_est:")
print(df_previous_est)

# 执行外连接并添加指示器
merged_df = pd.merge(df_current_est, df_previous_est, how='outer', indicator=True)

# 筛选出存在差异的行(即不完全匹配的行)
changed_df = merged_df[merged_df['_merge'] != 'both'].copy()

# 打印结果,_merge列清晰地指示了行的来源
print("\n差异行及其来源:")
print(changed_df)

输出解释: 在上述示例中,changed_df将包含所有在df_current_est和df_previous_est之间不完全匹配的行。_merge列的值(left_only或right_only)明确告诉我们该差异行是来自当前估算还是历史估算。例如,如果EstimateID为10061的行在df_current_est中QtyBins为320,而在df_previous_est中QtyBins为9000,那么即使其他列相同,由于QtyBins不同,这两行也会被视为差异,并分别显示为left_only和right_only。

注意事项:

  • 不要删除_merge列: _merge列是indicator=True参数生成的关键信息,如果将其删除,就无法直接判断行的来源了。
  • 定义“差异”: pd.merge默认是基于所有共享列进行匹配。如果只想基于部分列进行匹配并找出其他列的差异,需要明确指定on参数,并在后续处理中比较非on列。本教程的例子是基于所有列进行匹配。

保留原始DataFrame的行索引

在某些情况下,除了知道差异行来自哪个DataFrame外,我们可能还需要知道这些差异行在原始DataFrame中的具体行索引。_merge列本身不保留原始的行索引信息,因为它生成的是一个新的DataFrame。为了追踪原始索引,我们需要在合并之前将索引转换为普通列。

示例代码:保留原始索引

import pandas as pd

# 模拟数据,带有自定义索引
df1 = pd.DataFrame({'key': ['one', 'two', 'three'], 'value1': [1, 2, 3]},
                   index=[101, 102, 103])
df2 = pd.DataFrame({'key': ['two', 'four', 'three'], 'value2': [20, 40, 30]},
                   index=[201, 202, 203])

print("df1 (带索引):")
print(df1)
print("\ndf2 (带索引):")
print(df2)

# 在合并前将索引重置为列,并指定后缀以区分
merged_df_with_indices = (
    pd.merge(df1.reset_index(),  # 将df1的索引转换为'index'列
             df2.reset_index(),  # 将df2的索引转换为'index'列
             on='key',           # 以'key'列为基准进行合并
             suffixes=('_df1', '_df2'), # 为重复列名(包括'index')添加后缀
             how='outer',
             indicator=True)
)

# 筛选出差异行
changed_df_with_indices = merged_df_with_indices.query('_merge != "both"')

print("\n差异行及其来源和原始索引:")
print(changed_df_with_indices)

输出解释: 在这个例子中:

  1. df1.reset_index()将df1的索引(101, 102, 103)转换为一个名为index的普通列。df2也进行同样操作。
  2. suffixes=('_df1', '_df2')参数在合并时,如果遇到相同名称的非合并键列(如这里的index),会自动添加后缀,生成index_df1和index_df2。
  3. 最终的changed_df_with_indices不仅包含_merge列指示来源,还包含了index_df1和index_df2列,分别对应差异行在原始df1和df2中的索引。对于left_only的行,index_df2会是NaN;对于right_only的行,index_df1会是NaN。

总结

通过本教程,我们学习了如何利用pd.merge函数的how='outer'和indicator=True参数来有效地识别Pandas DataFrame之间的差异行,并清晰地追溯每条差异行的原始来源。此外,我们还探讨了通过在合并前重置索引的方法,来保留并追踪差异行在原始DataFrame中的具体行索引,这对于需要回溯数据源的复杂分析场景至关重要。掌握这些技巧,将极大地提升您在处理和比较DataFrame数据时的效率和准确性。

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

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

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

75

2025.12.04

Python 数据清洗与预处理实战
Python 数据清洗与预处理实战

本专题系统讲解 Python 在数据清洗与预处理中的核心技术,包括使用 Pandas 进行缺失值处理、异常值检测、数据格式化、特征工程与数据转换,结合 NumPy 高效处理大规模数据。通过实战案例,帮助学习者掌握 如何处理混乱、不完整数据,为后续数据分析与机器学习模型训练打下坚实基础。

4

2026.01.31

pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法

本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。

776

2026.02.13

微博网页版主页入口与登录指南_官方网页端快速访问方法
微博网页版主页入口与登录指南_官方网页端快速访问方法

本专题系统整理微博网页版官方入口及网页端登录方式,涵盖首页直达地址、账号登录流程与常见访问问题说明,帮助用户快速找到微博官网主页,实现便捷、安全的网页端登录与内容浏览体验。

247

2026.02.13

Flutter跨平台开发与状态管理实战
Flutter跨平台开发与状态管理实战

本专题围绕Flutter框架展开,系统讲解跨平台UI构建原理与状态管理方案。内容涵盖Widget生命周期、路由管理、Provider与Bloc状态管理模式、网络请求封装及性能优化技巧。通过实战项目演示,帮助开发者构建流畅、可维护的跨平台移动应用。

141

2026.02.13

TypeScript工程化开发与Vite构建优化实践
TypeScript工程化开发与Vite构建优化实践

本专题面向前端开发者,深入讲解 TypeScript 类型系统与大型项目结构设计方法,并结合 Vite 构建工具优化前端工程化流程。内容包括模块化设计、类型声明管理、代码分割、热更新原理以及构建性能调优。通过完整项目示例,帮助开发者提升代码可维护性与开发效率。

24

2026.02.13

Redis高可用架构与分布式缓存实战
Redis高可用架构与分布式缓存实战

本专题围绕 Redis 在高并发系统中的应用展开,系统讲解主从复制、哨兵机制、Cluster 集群模式及数据分片原理。内容涵盖缓存穿透与雪崩解决方案、分布式锁实现、热点数据优化及持久化策略。通过真实业务场景演示,帮助开发者构建高可用、可扩展的分布式缓存系统。

69

2026.02.13

c语言 数据类型
c语言 数据类型

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

52

2026.02.12

雨课堂网页版登录入口与使用指南_官方在线教学平台访问方法
雨课堂网页版登录入口与使用指南_官方在线教学平台访问方法

本专题系统整理雨课堂网页版官方入口及在线登录方式,涵盖账号登录流程、官方直连入口及平台访问方法说明,帮助师生用户快速进入雨课堂在线教学平台,实现便捷、高效的课程学习与教学管理体验。

15

2026.02.12

热门下载

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

精品课程

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

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