【问题标题】:Replacing a substring with a value from a column - part 2用列中的值替换子字符串 - 第 2 部分
【发布时间】:2020-03-08 02:21:36
【问题描述】:

这和我昨天发的一个帖子很相似。(Replacing a pandas substring with value from a column/Series),但难度稍大一些。对于字段,名称,我想将括号内的子字符串替换为它们所代表的字段的名称

例如在第 1 行中:name 保存值 'name1 (name3) 我想用名为 name3 的字段中的值替换子字符串 '(name3)'。 所以名字现在变成了'name1 Simon'

data = {'ID': [1, 2, 3, 4], 'name': ['name1 (name3)', 'name2 (name2)', 'name3', 'name4 (name2) (name3)'],
    'name2':['Jane','Abbie','Luke','Peter'],
   'name3': ['Simon','Peter','Annie','Robinson']}

df = pd.DataFrame(data)

import re

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

预期结果:

ID  name    name2   name3
0   1   name1 Simon Jane    Simon
1   2   name2 Abbie Abbie   Peter
2   3   name3   Luke    Annie
3   4   name4 Peter Robinson    Peter   Robinson

实际结果:

ID  name    name2   name3
0   1   name1 Jane  Jane    Simon
1   2   name2 Abbie Abbie   Peter
2   3   name3   Luke    Annie
3   4   name4 Peter Peter   Peter   Robinson

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    这是使用apply的一种方法

    例如:

    data = {'ID': [1, 2, 3, 4], 'name': ['name1 (name3)', 'name2 (name2)', 'name3', 'name4 (name2) (name3)'],
        'name2':['Jane','Abbie','Luke','Peter'],
       'name3': ['Simon','Peter','Annie','Robinson']}
    
    df = pd.DataFrame(data)
    import re
    
    def foo(val):
        return re.sub(r"\((.*?)\)", lambda y: val[y.group(1)], val['name'])
    
    df['new_name'] = df.apply(foo, axis=1)
    print(df)
    

    输出:

       ID                   name  name2     name3              new_name
    0   1          name1 (name3)   Jane     Simon           name1 Simon
    1   2          name2 (name2)  Abbie     Peter           name2 Abbie
    2   3                  name3   Luke     Annie                 name3
    3   4  name4 (name2) (name3)  Peter  Robinson  name4 Peter Robinson
    

    【讨论】:

    • 谢谢 Rakesh,你能解释一下这个函数是如何工作的吗?只是为了让我可以适应我在工作中面临的问题?
    猜你喜欢
    • 2021-10-02
    • 2021-11-05
    • 1970-01-01
    • 2012-04-27
    • 1970-01-01
    • 2019-08-08
    • 2019-12-13
    • 2020-11-09
    相关资源
    最近更新 更多