Python datacompy 找出两个DataFrames不同的地方

yizhihongxing

首先,Python datacompy是一个Python库,可以用于比较两个Pandas数据框架(DataFrames)。该应用程序比较不同数据框架中列的值和缺少的行。

下面是使用Python datacompy库执行数据框架比较的详细步骤。

安装Python datacompy

在开始之前,我们需要先安装Python datacompy库。可以使用以下命令在命令行中进行安装:

pip install datacompy

导入Python datacompy

安装了Python datacompy后,下一步就是将它导入我们的Python应用程序中。可以使用以下命令导入Python datacompy库:

import datacompy

加载数据框架

在Python中,数据框架可以使用Pandas库加载。例如,以下代码加载了名为df1和df2的两个数据框架:

import pandas as pd

df1 = pd.read_csv('file1.csv')
df2 = pd.read_csv('file2.csv')

数据框架比较

有了两个数据框架和Python datacompy库,我们就可以开始比较数据框架了。以下代码比较了df1和df2数据框架之间的差异:

compare = datacompy.Compare(
    df1,
    df2,
    join_columns='id',      # 指定join的列
    abs_tol=0.0001,         # 绝对容差值(absolute_tolerance),默认为0
    rel_tol=0.0001,         # 相对容差(percentage_tolerance或relative_tolerance),默认为0
    df1_name='Original',    # 第一个DataFrame的名称
    df2_name='New'          # 第二个DataFrame的名称
)

print(compare.report())

以上代码指定了一个join列“id”,用于连接两个数据框架。它还使用了绝对和相对容差值来确定两个值是否相等。

最后,compare.report()方法可打印两个数据框之间的差异。输出结果将提供详细的列比较、缺失值和非零计数。

以下是一个示例输出结果:

DataComPy Comparison
--------------------

DataFrame Summary
-----------------

  DataFrame  Columns  Rows
0  Original        4   100
1       New        4   105

Column Summary
--------------

Number of columns in common: 4
Number of columns in Original but not in New: 0
Number of columns in New but not in Original: 0

Row Summary
-----------

Matched on: id
Any duplicates on match column: No
Absolute Tolerance: 0.0001
Relative Tolerance: 0.0001
Number of rows in common: 98
Number of rows in Original but not in New: 2
Number of rows in New but not in Original: 7

Column Comparison
--------------
Column Comparison: id
Approximately 0.00% | 0 Values in Original but not in New
Approximately 0.00% | 0 Values in New but not in Original
Mismatched Values: 2

Column Comparison: name
Approximately 1.00% | 1 Values in Original but not in New
Approximately 0.00% | 0 Values in New but not in Original
Mismatched Values: 1

Column Comparison: age
Approximately 0.00% | 0 Values in Original but not in New
Approximately 3.81% | 4 Values in New but not in Original
Mismatched Values: 4

Column Comparison: gender
Approximately 0.00% | 0 Values in Original but not in New
Approximately 0.00% | 0 Values in New but not in Original
Mismatched Values: 0

在上面的示例中,可以看到有2行在原始数据框架中但不在新数据框架中,并且有7个行在新数据框架中但不在原始数据框架中。还可以看到,在“name”列和“age”列中有一些不同的值。

我们还可以将比较结果保存到一个新的数据框中。以下示例将比较结果存储在名为“df_diff”的新数据框中:

df_diff = compare.highlight_diffs()

highlight_diffs()方法返回一个包含两个数据框架之间差异的新数据框架。

如果想将特定的差异指定为过滤条件,则需要将highlight_diffs()方法与filter()方法一起使用。以下是一个示例:

diff_filter = datacompy.filters.ReplaceSubstringFilter(column='name', substr='Tom', match_entire=False) #只比较`name`列中不包括Tom的情况

df_diff_filtered = compare.highlight_diffs().filter(diff_filter)

示例 1

假设我们有以下两个数据框架:

DataFrame A:
 id |  name   | age
----|---------|----
  1 |   Tom   | 20
  2 |  Sarah  | 25
  3 |   Rick  | 30

DataFrame B:
 id |  name   | age
----|---------|----
  1 |   Tom   | 20
  2 |  Sarah  | 26
  3 |   Rick  | 35
  4 |   John  | 40

我们想比较这两个数据框架中的数据,并找出它们之间的差异。

请使用以下代码比较两个数据框,并将差异保存到名为“df_diff”的新数据框中:

import pandas as pd
import datacompy

df_A = pd.DataFrame({
    'id': [1, 2, 3],
    'name': ['Tom', 'Sarah', 'Rick'],
    'age': [20, 25, 30]
})

df_B = pd.DataFrame({
    'id': [1, 2, 3, 4],
    'name': ['Tom', 'Sarah', 'Rick', 'John'],
    'age': [20, 26, 35, 40]
})

compare = datacompy.Compare(
    df_A,
    df_B,
    join_columns='id',
    abs_tol=0.0001,
    rel_tol=0.0001,
    df1_name='Original',
    df2_name='New'
)

df_diff = compare.highlight_diffs()

最后,输出差异的内容:

print(df_diff)

输出结果如下:

     _merge  id  name_left name_right  age_left  age_right
2    right_only   4       NaN       John       NaN       40.0
8   column_mismatch  NaN       NaN        Rick       NaN       35.0
9       both    2     Sarah      Sarah      25.0      26.0
10  column_mismatch  NaN       NaN         Tom      NaN       20.0

在这个例子中,我们可以看到比较结果的每一行,以及左右两个数据框中各个数据列之间的差异。输出中包含了如下四种情况:

  • “_merge”列包含了左右数据框的状态:仅在左边出现、仅在右边出现、都出现等。
  • “id”列包含了匹配两个数据框其中一列的值。
  • “name_left”列包含了左边的数据框,而“name_right”则包含了右边的数据框。
  • “age_left”列包含了左边的数据框,而“age_right”则包含了右边的数据框。

示例 2

假设我们有以下两个数据框架:

DataFrame A:
 id |  name   | age
----|---------|----
  1 |   Tom   | 20
  2 |  Sarah  | 25
  3 |   Rick  | 30

DataFrame B:
 id |  name   | age
----|---------|----
  1 |   Tom   | 20
  2 |  Sarah  | 26
  3 |   Rick  | 35
  4 |   John  | 40

我们想比较这两个数据框架,并只查看“age”列中的差异。

下面的代码将按以下方式完成:

import pandas as pd
import datacompy

df_A = pd.DataFrame({
    'id': [1, 2, 3],
    'name': ['Tom', 'Sarah', 'Rick'],
    'age': [20, 25, 30]
})

df_B = pd.DataFrame({
    'id': [1, 2, 3, 4],
    'name': ['Tom', 'Sarah', 'Rick', 'John'],
    'age': [20, 26, 35, 40]
})

compare = datacompy.Compare(
    df_A,
    df_B,
    join_columns='id',
    abs_tol=0.0001,
    rel_tol=0.0001,
    df1_name='Original',
    df2_name='New'
)

diff_filter = datacompy.filters.NumericToleranceFilter(column='age', abs_tol=5, rel_tol=0) # 只比较绝对容差为5的情况

df_diff = compare.highlight_diffs().filter(diff_filter)

该示例中,NumericToleranceFilter()方法允许我们仅比较“age”列中绝对容差值为5的数据差异。在结果中,只有值“25”与“26”被视为差异。

输出结果如下:

      _merge  id name_left name_right  age_left  age_right
8    both    2    Sarah     Sarah        25         26

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python datacompy 找出两个DataFrames不同的地方 - Python技术站

(0)
上一篇 2023年5月14日
下一篇 2023年5月14日

相关文章

  • 如何在Pandas中删除包含特定字符串的行

    删除包含特定字符串的行是Pandas中常见的数据清洗操作之一。以下是在Pandas中删除包含特定字符串的行的完整攻略。 准备工作 首先需要导入Pandas库和数据集。可以使用以下代码导入库和数据集,并显示前5行数据。 import pandas as pd # 读取数据集 df = pd.read_csv(‘data.csv’) # 显示前5行数据 prin…

    python-answer 2023年3月27日
    00
  • 在Pandas中使用Timedelta和Period来创建基于DateTime的索引

    在Pandas中,可以使用Timedelta和Period来创建基于DateTime的索引。具体步骤如下: 1.导入Pandas和Numpy模块 import pandas as pd import numpy as np 2.生成时间序列数据 我们可以使用pd.date_range()函数来生成时间序列索引。其中可以指定起始时间、结束时间等参数,更多参数可…

    python-answer 2023年3月27日
    00
  • 详解PANDAS 数据合并与重塑(join/merge篇)

    详解PANDAS数据合并与重塑(join/merge篇) 在PANDAS中,数据合并和重塑是十分重要的基础操作。本文将详细讲解PANDAS中的数据合并和重塑。 合并数据 横向合并 横向合并意味着将两个数据集按照行合并,即增加新的列。 可以使用pandas中的merge()函数实现。例如: import pandas as pd df1 = pd.DataFr…

    python 2023年5月14日
    00
  • Python+Empyrical实现计算风险指标

    下面我将详细讲解如何使用Python和Empyrical实现计算风险指标,包括以下几个步骤: 安装必要的Python库 数据准备 计算风险指标 1. 安装必要的Python库 在Python中,我们可以通过pip安装需要的库。Empyrical是一个用于金融统计的Python库,可以帮助我们计算各种风险指标。安装Empyrical可以使用以下命令: pip …

    python 2023年6月13日
    00
  • python pandas中DataFrame类型数据操作函数的方法

    下面是Python Pandas中DataFrame类型数据操作函数的方法的完整攻略: DataFrame简介 在Python Pandas中,DataFrame是一种2D的表格数据结构,类似于Excel中的表格。它由一组列构成,每一列可以是不同的数据类型(整数、浮点数、字符串、布尔值等等),并且每个DataFrame也有一个索引(行标签)。 创建DataF…

    python 2023年5月14日
    00
  • 串联Pandas数据框架的两列数据

    串联Pandas数据框架的两列数据,需要使用Pandas的concat函数(即concatenate的缩写,意为连接)。具体步骤如下: 选取要串联的两列数据(或者多列)。 假设我们有以下两个数据框架df1和df2: import pandas as pd import numpy as np df1 = pd.DataFrame({‘A’: [‘A0’, ‘…

    python-answer 2023年3月27日
    00
  • Pandas读取MySQL数据到DataFrame的方法

    这篇文章将详细讲解如何使用Pandas读取MySQL数据到DataFrame的方法。Pandas是一个在Python中非常流行的数据处理工具,而MySQL则是一个流行的关系型数据库。通过将这两个工具结合起来,我们可以轻松地将MySQL中的数据读取到Pandas的DataFrame中,利用DataFrame进行进一步的数据分析工作。 步骤一:安装必备的Pyth…

    python 2023年5月14日
    00
  • pandas数据清洗实现删除的项目实践

    本文将介绍如何使用Pandas对数据进行清洗,并实现删除不必要的数据。本文的目的是让读者了解Pandas数据清洗的基本原理和实现方法,方便读者在自己的数据分析项目中使用Pandas快速、高效地完成数据清洗。本文假定读者已经熟悉了Pandas的基本数据操作和Python编程语言。 1. 加载数据 首先,我们需要将要清洗的数据加载进来。在本示例中,我们将使用一个…

    python 2023年5月14日
    00
合作推广
合作推广
分享本页
返回顶部