【问题标题】:Pandas CSV difference comparison when matching IDs匹配ID时的Pandas CSV差异比较
【发布时间】:2020-06-11 23:37:50
【问题描述】:

在两个 CSV 文件中,有一个文件包含涉及不同字段的额外列,我想知道如何突出显示这些不同的列。

假设这是 CSV1,

ID | StartDate |   EndDate  |  Poop | Name
 1 |  2-Jun-10 | 31-Oct-99  | Poop1 | Poopy
 2 |  1-Jun-10 | 30-Oct-98  | Poop2 | Butt
 3 |  1-Jun-90 | 1-Jun-99   | Poop3 | Hole

给定这些列,分别为 CSV2:

ID | StartDate | Name
 1 |  2-Jun-12 | Poopy
 2 |  1-Jun-12 | Butt
 4 | 1-Jun-14  | Ew

我如何能够: 突出列中的差异? (即在匹配 ID 并查找差异时,突出显示相同列中的差异,即同一列中出现 CSV1 而不是 CSV2)

所以这些表的结果是:

“在CSV2中名称:Ew没有出现在CSV1中,如ID所示:4 not exist in CSV1”

"In CSV1 Name: Hole doesn't appear in CSV2, as shown by ID: 3 not exist in CSV2"

在此先感谢,因为我遇到了麻烦,而且手动操作似乎很简单,但不知道如何编码。到目前为止我已经尝试过了:

import item as item
import pandas as pd
import numpy as np

csv1 = pd.read_csv('C:\\poop1.csv', encoding="ISO-8859-1")
csv2 = pd.read_csv('C:\\poop2.csv', encoding="ISO-8859-1")
csv1.head()
csv1.equals(csv2)
print(csv2[~csv2.ID.isin(csv1.ID)])
print(csv1[~csv1.ID.isin(csv2.ID)]) 

【问题讨论】:

  • 您是否尝试过获取列列表并比较联合中的列?
  • 我删除了rexcel 标签,因为这个问题与这两个工具没有直接关系。从技术上讲,没有 Excel CSV。 CSV 是一种行业数据格式,可以像在记事本或其他软件中一样在 Excel 电子表格中打开。
  • 另外,避免问太多宽泛的问题,并在您面临的具有挑战性的单个项目上保持具体。尝试的代码似乎没有触及项目 1-3。如果您不知道如何操作,请阅读许多 Pandas 文档、教程、博客、视频等。请参阅 How much research effort is expected of Stack Overflow users?

标签: python pandas csv


【解决方案1】:

首先,CSV 文件不是 Excel 工作表,而是具有表示包含字段的行的约定的文本文件。每个字段都包含一些数据的字符串表示,没有类型的指示。这意味着任何关于变量类型的问题都是没有意义的。

现在回答你的问题:

  1. 比较/匹配从 CSV1 到 CSV2 的 ID,在 CSV1 或 CSV2 中显示缺失的 ID

    您可以将数据框与 indicator=True 合并并检查特殊列 _merge:如果 id 仅存在于第一个、仅存在于第二个或两者中,则它包含 leftrightboth

    pd.merge(excel1, excel2, how='outer', on='ID', indicator=True)[['ID', '_merge']]
    
  2. 查看 CSV2 中的 StartDate 是否介于 CSV1 的开始日期和结束日期之间

    这里再次合并两个数据框并询问(在转换数据列之后):

    excel2['StartDate'] = pd.to_datetime(excel2['StartDate'])
    for col in ['StartDate', 'EndDate']:
        excel1[col] = pd.to_datetime(excel1[col])
    tmp = pd.merge(excel1, excel2, how='outer', on='ID', indicator=True)
    sd2between = (tmp.StartDate_x >= tmp.StartDate_y)&(tmp.StartDate_x<=tmp.EndDate)
    
  3. 突出显示列中的差异? (即告诉用户“便便”是 CSV1 中没有出现在 CSV2 中的列,并且还突出显示相同列中的差异,即有一个东西出现在 CSV1 但不是 CSV2)

    我真的无法理解那部分......

【讨论】:

  • 谢谢谢尔盖!所有这些都非常有帮助。我编辑了这个问题,以便 3 更清楚。
猜你喜欢
  • 2020-05-13
  • 2014-06-08
  • 2019-06-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-18
  • 1970-01-01
相关资源
最近更新 更多