用列/系列中的值替换pandas子字符串

时间:2019-11-11 17:48:20

标签: python pandas

我试图用pandas列中的值替换Pandas子字符串。之前尚未回答过这个问题。

我尝试使用.replace()方法,但抛出以下错误:

  

TypeError跟踪(最近的呼叫   最后)   ----> 1 df ['name']。str.replace('(C)',df.name2)

     

〜/ opt / anaconda3 / lib / python3.7 / site-packages / pandas / core / strings.py在   包装器(自己,* args,** kwargs)1841)1842
  引发TypeError(msg)   -> 1843 return func(self,* args,** kwargs)1844 1845包装器。名称 = func_name

     

〜/ opt / anaconda3 / lib / python3.7 / site-packages / pandas / core / strings.py在   替换(self,pat,repl,n,case,flags,regex)2714 def   replace(self,pat,repl,n = -1,case = None,flags = 0,regex = True):
  2715.结果= str_replace(   -> 2716 self._parent,pat,repl,n = n,case = case,flags = flags,regex = regex 2717)2718返回   self._wrap_result(result)

     

〜/ opt / anaconda3 / lib / python3.7 / site-packages / pandas / core / strings.py在   str_replace(arr,pat,repl,n,case,flags,regex)       597#检查repl是否有效(GH 13438,GH 15055)       598如果不是(is_string_like(repl)或callable(repl)):   -> 599提高TypeError(“ repl必须是字符串或可调用”)       600       601 is_compiled_re = is_re(pat)

     

TypeError:repl必须为字符串或可调用

data = {'id': [1, 2, 3, 4], 'name': ['name1 (C)', 'name2 (B)', 'name3', 'name4'],
        'name2':['Jane','Abbie','Luke','Peter']}


df = pd.DataFrame(data)

df['name'].str.replace('\(C\)', df.name2)

预期结果:

    id  name    name2
0   1   name1 Jane  Jane
1   2   name2 Abbie Abbie
2   3   name3   Luke
3   4   name4   Peter

1 个答案:

答案 0 :(得分:0)

您需要python re.sub和listcomp

import re

df['new_name'] = [re.sub(r'\(\w+\)', r, s) for r, s in zip(df.name2, df.name)]

Out[280]:
   id       name  name2     new_name
0   1  name1 (C)   Jane   name1 Jane
1   2  name2 (B)  Abbie  name2 Abbie
2   3      name3   Luke        name3
3   4      name4  Peter        name4