我正在使用Objecompy来比较两个Objecrame中的所有列.我的目标是提取具有不匹配值的列名.

在下面的示例中,我使用inventory_id作为连接列来比较df1和df2.其中一列显示不匹配的值,即"indinv_vari_ware_uid".这是一个简单的例子,在实际工作中,经常会看到多个列的值不匹配.

是否有一种方法可以以编程方式从结果中提取这些不匹配的列名?最终目标是在文本文件或日志(log)中打印这些列名,而不是让用户阅读比较报告(每个生产运行中将有数百个列名).

import datacompy
compare = datacompy.Compare(df1, df2, join_columns=['inventory_id'], 
df1_name='df1', df2_name='df2')  
print(compare.report())

enter image description here

推荐答案

您可以使用compare.column_stats来实现这一点:一个包含每列相关信息的字典的列表.

  • 样品设置:
import pandas as pd
import datacompy

data = {'id': [1, 2],
        'col1': [1, 2]}
df1 = pd.DataFrame(data)

data2 = {'id': [1, 2],
         'col1': ['A', 'B']}
df2 = pd.DataFrame(data2)

compare = datacompy.Compare(df1, df2, join_columns=['id'])
  • 打印:
print(compare.report())

# ...

Columns with Unequal Values or Types
------------------------------------

  Column df1 dtype df2 dtype  # Unequal  Max Diff  # Null Diff
0   col1     int64    object          2       0.0            0

Sample Rows with Unequal Values
-------------------------------

   id  col1 (df1) col1 (df2)
0   2           2          B
1   1           1          A
  • 访问column_stats:
compare.column_stats

[{'column': 'id',
  'match_column': '',
  'match_cnt': 2,
  'unequal_cnt': 0,
  'dtype1': 'int64',
  'dtype2': 'int64',
  'all_match': True,
  'max_diff': 0.0,
  'null_diff': 0},
 {'column': 'col1',
  'match_column': 'col1_match',
  'match_cnt': 0,
  'unequal_cnt': 2,
  'dtype1': 'int64',
  'dtype2': 'object',
  'all_match': False,
  'max_diff': 0.0,
  'null_diff': 0}]
  • 使用列表理解获取所有列名,其中unequal_cnt != 0:
unmatched_columns = [stat['column'] for stat in compare.column_stats
                     if stat['unequal_cnt'] != 0]
unmatched_columns
# ['col1']

也可以方便地创建一个带有pd.DataFramedf,并根据需要进行过滤:

column_stats = pd.DataFrame(compare.column_stats)

column_stats

  column match_column  match_cnt  unequal_cnt dtype1  dtype2  all_match  \
0     id                       2            0  int64   int64       True   
1   col1   col1_match          0            2  int64  object      False   

   max_diff  null_diff  
0       0.0          0  
1       0.0          0

# e.g. column_stats[column_stats['unequal_cnt'].ne(0)]  

Python相关问答推荐

将DF中的名称与另一DF拆分并匹配并返回匹配的公司

我在使用fill_between()将最大和最小带应用到我的图表中时遇到问题

类型错误:输入类型不支持ufuncisnan-在执行Mann-Whitney U测试时[SOLVED]

追溯(最近最后一次调用):文件C:\Users\Diplom/PycharmProject\Yolo01\Roboflow-4.py,第4行,在模块导入roboflow中

如何记录脚本输出

用合并列替换现有列并重命名

切片包括面具的第一个实例在内的眼镜的最佳方法是什么?

Julia CSV for Python中的等效性Pandas index_col参数

数据抓取失败:寻求帮助

为什么以这种方式调用pd.ExcelWriter会创建无效的文件格式或扩展名?

如何在达到end_time时自动将状态字段从1更改为0

Python全局变量递归得到不同的结果

如何从pandas DataFrame中获取. groupby()和. agg()之后的子列?

将链中的矩阵乘法应用于多组值

Python OPCUA,modbus通信代码运行3小时后出现RuntimeError

如何关联来自两个Pandas DataFrame列的列表项?

高效地计算数字数组中三行上三个点之间的Angular

函数()参数';代码';必须是代码而不是字符串

关于数字S种子序列内部工作原理的困惑

将参数从另一个python脚本中传递给main(argv