在两个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)])
答案 0 :(得分:2)
首先,不是一个Excel文件是CSV文件,但是它是一个文本文件,带有约定以表示包含字段的行。每个字段都包含一些数据的字符串表示形式,没有类型指示。这意味着任何有关变量类型的问题都是没有道理的。
现在提出您的问题:
比较/匹配CSV1和CSV2中的ID,显示CSV1或CSV2中缺少的ID
您可以将数据框与indicator=True
合并并检查特殊列_merge
:如果仅存在ID,则它包含left
,right
或both
首先,只有第二或两者兼有:
pd.merge(excel1, excel2, how='outer', on='ID', indicator=True)[['ID', '_merge']]
查看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)
突出显示列中的差异? (即告诉用户“船尾”是CSV1中的一列,而该列未出现在CSV2中,并突出显示相同列中的差异,即一件事出现在CSV1中,但未出现在CSV2中)
我真的不明白那部分...