我正在尝试使用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文件中。
我希望有人可以给我一个很好的指导,以解决这个问题。 预先谢谢你,
答案 0 :(得分:0)
我们首先将您在第二个数据框中的computer_name
列除以.
,然后保留第一部分。
然后我们用Series.isin
检查第二个数据帧中的computer_name是否在第一个数据帧中。
当存在匹配项时,我们使用np.where
有条件地填写Yes
或No
:
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