匹配ID时的熊猫CSV差异比较

时间:2020-06-11 12:31:20

标签: python pandas csv

在两个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所示,在CSV1中不存在”

“在CSV1名称中:在CSV2中没有出现孔,如ID:3所示,在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)]) 

1 个答案:

答案 0 :(得分:2)

首先,不是一个Excel文件是CSV文件,但是它是一个文本文件,带有约定以表示包含字段的行。每个字段都包含一些数据的字符串表示形式,没有类型指示。这意味着任何有关变量类型的问题都是没有道理的。

现在提出您的问题:

  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中)

    我真的不明白那部分...