【问题标题】:Replace string column endwiths specific substrings under condition of another column with Pandas用 Pandas 在另一列的条件下替换字符串列以特定子字符串结尾
【发布时间】:2021-09-14 10:07:09
【问题描述】:

给定一个数据集如下:

   id  company name  value
0   1    Finl Corp.      7
1   2  Fund Tr Corp      6
2   3   Inc Invt Fd      5
3   4  Govt Fd Inc.      3
4   5   Trinity Inc      5

或者:

[{'id': 1, 'company name': 'Finl Corp.', 'value': 7},
 {'id': 2, 'company name': 'Fund Tr Corp', 'value': 6},
 {'id': 3, 'company name': 'Inc Invt Fd', 'value': 5},
 {'id': 4, 'company name': 'Govt Fd Inc.', 'value': 3},
 {'id': 5, 'company name': 'Trinity Inc', 'value': 5}]

如果company name 列的内容以['Corp.', 'Corp', 'Inc.', 'Inc'] 结尾,同时value>= 5,我需要替换

预期结果将是:

   id  company name  value
0   1          Finl      7
1   2       Fund Tr      6
2   3   Inc Invt Fd      5
3   4  Govt Fd Inc.      3
4   5       Trinity      5

如何在 Pandas 和正则表达式中实现这一点?

有错误的试用码:TypeError: replace() missing 1 required positional argument: 'repl'

mask = (df1['value'] >= 5)
df1.loc[mask, 'company_name_concise']= df1.loc[mask, 'company name'].str.replace(r'\bCorp.|Corp|Inc.|Inc$', regex=True)

【问题讨论】:

    标签: python-3.x pandas dataframe python-re


    【解决方案1】:

    您可以通过添加\s* 为空格和$ 为字符串结尾来更改正则表达式中的值:

    mask = (df1['value'] >= 5)
    
    
    L = ['Corp.', 'Corp', 'Inc.', 'Inc']
    pat = '|'.join(f'\s*{x}$' for x in L)
    
    df1.loc[mask, 'company name']= df1.loc[mask,'company name'].str.replace(pat,'',regex=True)
    
    print (df1)
       id  company name  value
    0   1          Finl      7
    1   2       Fund Tr      6
    2   3   Inc Invt Fd      5
    3   4  Govt Fd Inc.      3
    4   5       Trinity      5
    

    【讨论】:

    • 谢谢,但是我发现第三行的Inc Invt Fd 有一个小问题,Inc 不应该被替换,因为Inc 不是结尾,而是开头。
    • @ahbon - 添加到答案中。
    【解决方案2】:

    str.replace 接受 两个 参数,模式和替换:

    mask = (df1['value'] >= 5)
    df1.loc[mask, 'company_name_concise']= df1.loc[mask, 'company name'].str.replace(r'\b(?:Corp\.?|Inc\.?)$', '', regex=True)
    

    请注意,您想要的正则表达式模式是:

    \b           word boundary
    (?:
        Corp\.?  match Corp or Corp.
        |        OR
        Inc\.?   match Inc or Inc.
    )
    $            at the end of the company name
    

    【讨论】:

    • Inc 之后的句点也应该用反斜杠转义吗?即Inc\.? 而不是Inc.? ?
    • @SeaBean 你是对的。我是用手机接的。容易出错。
    【解决方案3】:

    或者对于代码长度,您可以直接修改整个列并按索引分配:

    df.loc[df['value'] > 5, 'company name'] = df['company name'].str.replace(r'\bCorp.|Corp|Inc.|Inc$', '')
    >>> df
    

       id  company name  value
    0   1         Finl       7
    1   2      Fund Tr       6
    2   3   Inc Invt Fd      5
    3   4  Govt Fd Inc.      3
    4   5   Trinity Inc      5
    >>> 
    

    或者np.where的解决方案:

    >>> df['company name'] = np.where(df['value'] > 5, df['company name'].str.replace(r'\bCorp.|Corp|Inc.|Inc$', ''), df['company name'])
    >>> df
       id  company name  value
    0   1         Finl       7
    1   2      Fund Tr       6
    2   3   Inc Invt Fd      5
    3   4  Govt Fd Inc.      3
    4   5   Trinity Inc      5
    >>> 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-06-06
      • 2018-08-31
      • 2014-12-23
      • 2017-01-28
      • 2017-04-18
      • 2021-10-26
      • 2013-09-28
      相关资源
      最近更新 更多