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

首先,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
阅读剩余 81%

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

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

相关文章

  • Python3.5 Pandas模块之DataFrame用法实例分析

    下面是详细的讲解“Python3.5Pandas模块之DataFrame用法实例分析”的完整攻略,包括示例说明: 什么是DataFrame? DataFrame是Pandas中一种很常用的数据结构。它可以被看作是由许多Series对象合并成的二维表格,拥有行和列的索引。在数据科学领域,DataFrame是数据分析的常用工具之一。 DataFrame的创建 P…

    python 2023年5月14日
    00
  • 从一个Numpy数组创建一个DataFrame,并指定索引列和列标题

    通过Numpy数组创建DataFrame的过程中,需要借助于pandas库中的DataFrame构造函数,可以在构造函数中指定参数,如数据(Numpy数组),列标题(列名),索引列等信息。 下面是完整的从Numpy数组创建DataFrame,并指定索引列和列标题的攻略: 首先需要导入pandas和numpy库: import pandas as pd imp…

    python-answer 2023年3月27日
    00
  • 如何在Pandas中用频率确定周期范围

    在Pandas中,我们可以使用频率来确定日期或时间段的周期范围。具体步骤如下: 1.导入常用的Python库和数据:首先需要导入常用的Python库,如Pandas、Numpy等。然后,我们需要加载我们要处理的数据,这里我们以一份包含销售数据的数据集为例,加载方式可以使用Pandas库的read_csv方法。 import pandas as pd impo…

    python-answer 2023年3月27日
    00
  • python pandas分割DataFrame中的字符串及元组的方法实现

    当数据分析师处理一些包含字符串和元组的DataFrame时,需要对这些数据进行适当的分割和处理,以便更好地进行数据分析和挖掘。Python pandas提供了非常方便的方法,可以轻松地完成对DataFrame中字符串和元组的分割处理。 1. 分割DataFrame中的字符串 在DataFrame中,可以使用 str.split() 方法来对字符串进行分割。该…

    python 2023年5月14日
    00
  • pandas 修改列名的实现示例

    下面是“pandas 修改列名的实现示例”的完整攻略。 实现方法 在 Pandas 中,修改列名有多种方法,其中较为常见的方法是使用 rename() 方法和直接赋值修改列名属性。 使用 rename() 方法 使用 rename() 方法可以非常方便地修改 Pandas 数据框的列名,方法原型如下: DataFrame.rename(mapper=None…

    python 2023年5月14日
    00
  • Pandas中Series的属性,方法,常用操作使用案例

    下面是关于Pandas中Series的属性、方法、常用操作及示例说明的详细攻略。 1. Pandas中Series的属性 Series是Pandas中的一种数据类型,主要用来表示一维带标签的数组。它有以下几个常用的属性: values:获取Series的值,返回一个numpy数组。 index:获取Series的索引,返回一个Index对象。 dtype:获…

    python 2023年5月14日
    00
  • 在连接两个Pandas数据框架时防止重复的列

    在连接两个Pandas数据框架时,如果两个数据框架中的列名重复,那么连接时可能会出现一些问题,比如连接后的数据框架中的列名不好区分或者连接出来的结果不正确等。因此,我们需要防止列名重复。有以下几种方法可以实现: 重命名列名:在连接之前,可以对一个或两个数据框架的列名进行重命名,从而确保连接时不会出现列名重复的情况。可以使用Pandas的rename方法来实现…

    python-answer 2023年3月27日
    00
  • Pandas.DataFrame重置Series的索引index(reset_index)

    Pandas是Python中一个非常常用的数据分析库。而DataFrame是Pandas中最常用的数据结构。在进行数据处理时,我们通常需要对数据进行删减、增加或调整等操作,并且有时候我们需要通过DataFrame中的某个Series来进行一些操作,这时候就需要用到Pandas.DataFrame重置Series的索引index(reset_index)。 r…

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