根据公共列上的匹配值合并2个CSV文件,并将合并的新集合写入新的CSV文件

时间:2019-07-09 23:38:56

标签: python-3.x pandas csv sys

我正在尝试使用Pandas合并基于两个单独的CSV文件的内容 在两个CSV文件中都存在的一列上。

第一个CSV文件: 该文件包含500多个记录,该文件的格式为:

Computer_Name   Purchase_Date        Vendor           Is_Virtual      Is_Patched
--------------------------------------------------------------------------------
Computer_1      4-11-2018           Dell                 NaN            NaN
Computer_2      5-5-2016            HP                   Yes            NaN
Computer_3      1-05-2015           IBM                  NaN            NaN

第二个CSV: 此文件包含一列,并且可能包含较少的记录。 “ Computer_Name”列可能包含大小写混合的系统名称。另外,“ Computer_Name”可以包括系统的域名(即“ company.com”)。

Computer_Name
--------------------
Computer_1.company.com
Computer_3
Computer_5.company.com

如果该行的两个CSV文件中的“ Computer_Name”都匹配,我试图将每行中“ Is_Patched”列的值更改为“是”。

以下是我目前为止可以使用的内容:

import pandas as pd
import csv
import sys

pd.set_option('display.max_columns', None)

assets = pd.read_csv(r"C:\AssetsFile.csv")          #First CSV file
references = pd.read_csv(r"C:\ReferenceFile.csv")   #Second CSV file

assets['Computer_Name'] = assets['Computer_Name'].str.lower()

assets['Computer_Name'] = assets['Computer_Name'].str.split('.').str[0]

references['Computer_Name'] = references['Computer_Name'].str.lower()

references['Computer_Name'] = references['Computer_Name'].str.split('.').str[0]

assets.merge(references, on='Computer_Name')

但是,当这两个CSV文件中的“ Computer_Name”行都匹配时,我无法弄清楚如何在“ Is_patched”列中插入值“ Yes” 并将新的Pandas集写入新的CSV文件中。

我希望有人可以给我一个很好的指导,以解决这个问题。 预先谢谢你,

1 个答案:

答案 0 :(得分:0)

我们首先将您在第二个数据框中的computer_name列除以.,然后保留第一部分。

然后我们用Series.isin检查第二个数据帧中的computer_name是否在第一个数据帧中。

当存在匹配项时,我们使用np.where有条件地填写YesNo

s = references['Computer_Name'].str.split('.').str[0]

assets['Is_Patched'] = np.where(assets['Computer_Name'].isin(s), 'Yes', 'No')
  Computer_Name Purchase_Date Vendor Is_Virtual Is_Patched
0    Computer_1     4-11-2018   Dell        NaN        Yes
1    Computer_2      5-5-2016     HP        Yes         No
2    Computer_3     1-05-2015    IBM        NaN        Yes