因此,当我如此接近最终完成我的脚本时,我坚持使用条件比较并替换值。我希望你的指导:)
CSV1 with names a,b,host
addprinter,terminal,PC001
CSV2 with names oldhost,newhost
PC001,DC001
我现在要检查csv1.host,如果在CSV2.oldhost中找到,则读取CSV2.newhost并用CSV2.newhost替换CSV1.host 因此,在上面这个例子的最后,CSV1(或者可能更好的CSV3作为新输出)将如下所示: 添加打印机,终端,DC001
CSV1包含几百行,因此它应该遍历完整的文件。
我以为我会拥有它,但遗憾的是以下代码并不完整,似乎只适用于系列:
pd.np.where(result.host.str.contains(hosts.oldhost), hosts.newhost)
'导致'是.loc ifin
的输出我感觉它是一个for循环,然后是替换。正如我已经了解到的那样,以失败结束这一天结束将是令人沮丧的。因此,所有指导和想法都受到高度赞赏。
亲切的问候
米奇
答案 0 :(得分:1)
以下是我工作的一个例子。我使用了合并,但如果CSV2实际上只是一张地图,您可以将其用作dict
并在系列中使用map
函数。
>>> CSV1
a b host
0 addsomething ssh DC001
1 addprinter terminal PC001
>>> CSV2
oldhost newhost
0 PC001 DC001
>>> CSV3 = CSV1.merge(CSV2, left_on=['host'], right_on=['oldhost'], how='left')
>>> CSV3
a b host oldhost newhost
0 addsomething ssh DC001 NaN NaN
1 addprinter terminal PC001 PC001 DC001
>>> CSV3.host = CSV3.newhost.combine_first(CSV3.host)
>>> CSV3[['a', 'b', 'host']]
a b host
0 addsomething ssh DC001
1 addprinter terminal DC001
以下是使用dict
,map
并避免merge
>>> CSV1
a b host
0 addsomething ssh DC001
1 addprinter terminal PC001
>>> host_map = CSV2.set_index('oldhost').newhost.to_dict()
>>> host_map
{'PC001': 'DC001'}
>>> CSV1.host = CSV1.host.map(host_map).combine_first(CSV1.host)
>>> CSV1
a b host
0 addsomething ssh DC001
1 addprinter terminal DC001