比较两个CSV文件并导出Python中的异同?

2024-06-25 23:01:49 发布

您现在位置:Python中文网/ 问答频道 /正文

嘿,所有的,所以我一直有一些困难,试图完成我需要的两个独立的CSV文件。我在网上找到了一些散落在网上的脚本,它们可以做我想做的事情,但不完全是这样。我不再有我试过的代码,因为我已经删除了很多次不同的代码,以至于我已经盯着一个空白的py文件好长时间了。首先是CSV文件。在

在netscan.csv(包含计算机名称和序列号,有正确的数据,有型号)

Name        Serial   Models
computer1   serial1  model1
computer2   serial2  model2
computer3   serial3  model3
computer4   serial4  model4
...         ...

计算机_列表.csv(包含计算机名和序列号,具有正确的名称,不在netscan.csv,无型号,序列号错误)

^{pr2}$

所以我想做的是查看这两个文件,如果Name列中的值匹配,我希望它将netscan.csv中的行打印到一个新文件中,并对每一行执行此操作。之后,我希望它采取所有不存在的(计算机不存在于netscan.csv例如)并将其添加到新的csv中的更新的正确信息下。像这样:

Name        Serial   Models
computer1   serial1  model1
computer2   serial2  model2
computer3   serial3  model3
computer4   serial4  model4
computerH   serialN/A
computerP   serialN/A

我尝试过合并,for循环,写行等等,但我不知道如何才能完成这一点。任何帮助都将不胜感激。在

编辑:@unutbu我从你的代码中得到的基本上是

Name     Serial    Models
computer1   serial1  model1
computer2   serial2  model2
computer3   serial3  model3
computer4   serial4  model4
computerH   serialN/A
computerP   serialN/A
computer2   serialN/A
computer3   serialN/A
computer4   serialN/A

因此,虽然几乎所有的内容都是正确的,但是仍然存在来自computer_list.csv的重复Name行,如果这些行被正确的信息替换,则需要删除这些行。所以我想查找具有重复名称的行,如果序列号是serialN/A,就删除它们。希望这样做更有意义。在


Tags: 文件csv代码name名称models计算机serial
3条回答

这可能有助于进行各种比较

import numpy as np
import pandas as pd
#file_name = "list.xlsx"
df = pd.DataFrame({'List1':[1,2,3,4,5,5,11,4],'List 2':[3,5,6,8,9,3,4,9]}, columns=['List1', 'List 2'])#pd.read_excel(file_name, sheetname=0)
print(df)
#df.to_excel("list1.xlsx", header=True, index=False)
df['Intersect']=pd.DataFrame(np.intersect1d(df['List1'], df['List 2'])) #unique common in both
df['commonin1']=df['List1'][np.in1d(df['List1'], df['List 2'])] #non unique common items of list 1
df['commonin2']=df['List 2'][np.in1d(df['List 2'], df['List1'])] #non unique common items of list 2
df['1not2']=pd.DataFrame(np.setdiff1d(df['List1'], df['List 2'])) #in list1 but not in list 2
df['2not1']=pd.DataFrame(np.setdiff1d(df['List 2'], df['List1'])) #in list 2 but not in list1
df['1not2NU']=df['List1'][~np.in1d(df['List1'], df['List 2'])] #in list1 but not in list 2 non unique
df['2not1NU']=df['List 2'][~np.in1d(df['List 2'], df['List1'])] #in list 2 but not in list1 non unique
df['exclusive']=pd.DataFrame(np.setxor1d(df['List1'], df['List 2'])) # in a and not b + in b but not a
df=pd.concat([df,pd.DataFrame(np.union1d(df['List1'], df['List 2']), columns=['Union'])], axis=1) # unique all
df

看看这个:

import pandas as pd
netscan = pd.read_csv('netscan.csv', header=0) # read netscan.csv and columns names are from the first row of your csv
computer_list = pd.read_csv('computer_list.csv', header=0)

# An inner merge keeps only row found in both pandas.DataFrame 
computer_match = netscan.merge(right=computer_list, how='inner', on='Name', suffixes=('netscan_', 'computer_list_'))

# Get list of Name of computers that matches
match_list = computer_match.Name.unique().tolist()

# Get characteristics of not matched computers
computer_no_match = computer_list.loc[computer_list.Name.isin(match_list), :]

# Finally, save everything to CSV
computer_match.to_csv('computer_match.csv', index=False)
computer_no_match.to_csv('computer_no_match.csv', index=False)

您可以合并netscancomputer数据帧,然后用SerialN/A填充Serial列中缺少的值。在

import pandas as pd
netscan = pd.read_csv('netscan.csv')
computer = pd.read_csv('computer_list.csv', usecols=['Name'])
for df in [netscan, computer]:
    df['Name'] = df['Name'].str.rstrip()
result = pd.merge(netscan, computer, on='Name', how='outer')
result['Serial'] = result['Serial'].fillna('SerialN/A')
result.to_csv('result.csv', index=False)
print(result)

生成一个CSV文件(result.csv),其中包含

^{pr2}$

相关问题 更多 >