0

0

高效识别Pandas DataFrame差异并仅保留差异化数据

聖光之護

聖光之護

发布时间:2025-09-21 19:09:01

|

465人浏览过

|

来源于php中文网

原创

高效识别pandas dataframe差异并仅保留差异化数据

本文旨在提供一种高效、专业的Pandas DataFrame差异比较方法。通过利用DataFrame.compare()函数,结合索引设置和结果重塑技巧,我们能够精确地识别两个DataFrame之间在行和列上的差异,并最终生成一个仅包含这些差异化数据的简洁视图,从而简化数据审计和变更追踪工作。

引言:识别Pandas DataFrame中的差异

在数据分析和处理的日常工作中,我们经常需要比较两个结构相似的Pandas DataFrame,以找出它们之间的不同之处。例如,比较不同时间点的数据快照,或验证数据处理前后的变化。理想情况下,我们希望得到的输出不仅能指出哪些行存在差异,还能明确显示这些差异具体发生在哪些列上,并且只保留这些差异化的信息,剔除完全相同的部分。

考虑以下两个DataFrame df1 和 df2:

import pandas as pd

data1 = {
    'pet_name': ['Patrick', 'Patrick', 'Patrick', 'Patrick'],
    'exam_day': ['2023-01-01', '2023-01-02', '2023-01-03', '2023-01-04'],
    'result_1': [1, 2, 3, 4],
    'result_2': [10, 20, 30, 40],
    'pre_result_1': [123, 123, 123, 123]
}
df1 = pd.DataFrame(data1)

data2 = {
    'pet_name': ['Patrick', 'Patrick', 'Patrick', 'Patrick'],
    'exam_day': ['2023-01-01', '2023-01-02', '2023-01-03', '2023-01-04'],
    'result_1': [1, 99, 3, 4], # Difference here: df1 has 2, df2 has 99
    'result_2': [10, 20, 30, 100], # Another difference for demonstration
    'pre_result_1': [123, 123, 123, 123]
}
df2 = pd.DataFrame(data2)

print("df1:")
print(df1)
print("\ndf2:")
print(df2)

df1:

  pet_name    exam_day  result_1  result_2  pre_result_1
0  Patrick  2023-01-01         1        10           123
1  Patrick  2023-01-02         2        20           123
2  Patrick  2023-01-03         3        30           123
3  Patrick  2023-01-04         4        40           123

df2:

  pet_name    exam_day  result_1  result_2  pre_result_1
0  Patrick  2023-01-01         1        10           123
1  Patrick  2023-01-02        99        20           123
2  Patrick  2023-01-03         3        30           123
3  Patrick  2023-01-04         4       100           123

我们注意到 df1 和 df2 在以下位置存在差异:

  1. pet_name='Patrick', exam_day='2023-01-02' 行的 result_1 列:df1 为 2,df2 为 99。
  2. pet_name='Patrick', exam_day='2023-01-04' 行的 result_2 列:df1 为 40,df2 为 100。

如果仅仅使用 merge(..., indicator=True, how="outer") 并过滤 _merge != "both",虽然能识别出有差异的行,但会保留所有列,并且对同一差异行会分别显示 left_only 和 right_only 两条记录,无法直接突出差异所在的具体列。我们的目标是获得一个更精炼的视图,仅包含差异行和差异列,同时保留关键的标识列。

核心解决方案:使用DataFrame.compare()

Pandas 1.1.0 版本引入的 DataFrame.compare() 方法是专门为解决这类问题而设计的。它能够进行元素级别的比较,并以一种结构化的方式展示差异。

步骤一:准备数据——设置索引

为了让 compare() 方法能够正确地对齐和比较行,我们需要将DataFrame中的关键标识列(例如 pet_name 和 exam_day)设置为索引。这些列通常被称为“维度”列或“主键”列,它们在比较过程中不应被视为可变的值,而是作为行的唯一标识符。

TTSMaker
TTSMaker

TTSMaker是一个免费的文本转语音工具,提供语音生成服务,支持多种语言。

下载
df1_indexed = df1.set_index(['pet_name', 'exam_day'])
df2_indexed = df2.set_index(['pet_name', 'exam_day'])

print("df1_indexed (partial view):")
print(df1_indexed.head(2))

输出示例:

df1_indexed (partial view):
                       result_1  result_2  pre_result_1
pet_name exam_day                                      
Patrick  2023-01-01         1        10           123
         2023-01-02         2        20           123

通过设置索引,compare() 方法将基于这些索引值来匹配行。

步骤二:执行比较——compare(align_axis=0)

接下来,我们使用 compare() 方法对两个已设置索引的DataFrame进行比较。关键参数是 align_axis=0,它指示 compare() 在行级别进行对齐。

diff_df_raw = df1_indexed.compare(df2_indexed, align_axis=0)
print("Raw comparison output (diff_df_raw):")
print(diff_df_raw)

输出示例:

Raw comparison output (diff_df_raw):
                           result_1  result_2
pet_name exam_day                            
Patrick  2023-01-02 self        2.0       NaN
                    other      99.0       NaN
         2023-01-04 self        NaN      40.0
                    other       NaN     100.0

compare() 方法的输出特点:

  • 行索引: compare() 会在原始索引的基础上增加一个内部级别 (self 和 other),用于区分 df1 (self) 和 df2 (other) 中的值。
  • 列过滤: compare() 会自动过滤掉所有值都完全相同的列。在我们的例子中,pre_result_1 列在两个DataFrame中完全相同,因此它没有出现在输出中。
  • NaN 填充: 对于在特定行中没有差异的列,compare() 会用 NaN 填充。例如,在 2023-01-02 的差异行中,result_2 并没有差异,因此显示为 NaN。

步骤三:重塑输出——droplevel()与reset_index()

为了将 compare() 的输出重塑成我们期望的简洁格式(即每行显示一个差异值,且包含原始的关键标识列),我们需要进行额外的后处理。

  1. droplevel(-1): 这一步用于删除行索引中表示 self/other 的最内层级别。这样,对于同一个 (pet_name, exam_day) 组合,来自 self 和 other 的差异值将作为独立的

相关标签:

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

相关专题

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

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

49

2025.12.04

mysql标识符无效错误怎么解决
mysql标识符无效错误怎么解决

mysql标识符无效错误的解决办法:1、检查标识符是否被其他表或数据库使用;2、检查标识符是否包含特殊字符;3、使用引号包裹标识符;4、使用反引号包裹标识符;5、检查MySQL的配置文件等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

179

2023.12.04

Python标识符有哪些
Python标识符有哪些

Python标识符有变量标识符、函数标识符、类标识符、模块标识符、下划线开头的标识符、双下划线开头、双下划线结尾的标识符、整型标识符、浮点型标识符等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

271

2024.02.23

java标识符合集
java标识符合集

本专题整合了java标识符相关内容,想了解更多详细内容,请阅读下面的文章。

251

2025.06.11

c++标识符介绍
c++标识符介绍

本专题整合了c++标识符相关内容,阅读专题下面的文章了解更多详细内容。

121

2025.08.07

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

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

454

2023.07.04

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

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

264

2023.08.07

网站建设功能有哪些
网站建设功能有哪些

网站建设功能包括信息发布、内容管理、用户管理、搜索引擎优化、网站安全、数据分析、网站推广、响应式设计、社交媒体整合和电子商务等功能。这些功能可以帮助网站管理员创建一个具有吸引力、可用性和商业价值的网站,实现网站的目标。

718

2023.10.16

php源码安装教程大全
php源码安装教程大全

本专题整合了php源码安装教程,阅读专题下面的文章了解更多详细内容。

7

2025.12.31

热门下载

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

精品课程

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

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