如果第1列匹配,则用csv2第2列替换csv1列中的值

时间:2018-02-06 23:02:06

标签: python pandas dataframe python-3.6

因此,当我如此接近最终完成我的脚本时,我坚持使用条件比较并替换值。我希望你的指导:)

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循环,然后是替换。正如我已经了解到的那样,以失败结束这一天结束将是令人沮丧的。因此,所有指导和想法都受到高度赞赏。

亲切的问候

米奇

1 个答案:

答案 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

以下是使用dictmap并避免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