代码之家  ›  专栏  ›  技术社区  ›  SBad

用值替换Pandas系列中的多个子字符串

  •  15
  • SBad  · 技术社区  · 7 年前

    全部的

    为了替换一个特定列中的一个字符串,我已经这样做了,效果很好:

    dataUS['sec_type'].str.strip().str.replace("LOCAL","CORP")
    

    我现在想用一个字符串替换多个字符串,比如说替换 ["LOCAL", "FOREIGN", "HELLO"] 具有 "CORP"

    如何让它工作?下面的代码无效

    dataUS['sec_type'].str.strip().str.replace(["LOCAL", "FOREIGN", "HELLO"], "CORP")
    
    6 回复  |  直到 4 年前
        1
  •  25
  •   jpp    7 年前

    可以通过形成|分隔的字符串来执行此任务。这是因为 pd.Series.str.replace 接受正则表达式:

    将序列/索引中出现的模式/正则表达式替换为 其他字符串。等效于str.replace()或re。sub()。

    这避免了创建字典的需要。

    import pandas as pd
    
    df = pd.DataFrame({'A': ['LOCAL TEST', 'TEST FOREIGN', 'ANOTHER HELLO', 'NOTHING']})
    
    pattern = '|'.join(['LOCAL', 'FOREIGN', 'HELLO'])
    
    df['A'] = df['A'].str.replace(pattern, 'CORP')
    
    #               A
    # 0     CORP TEST
    # 1     TEST CORP
    # 2  ANOTHER CORP
    # 3       NOTHING
    
        2
  •  9
  •   BENY    7 年前

    replace 可以接受 dict ,os我们只是为那些需要替换的值创建一个dict

    dataUS['sec_type'].str.strip().replace(dict(zip(["LOCAL", "FOREIGN", "HELLO"], ["CORP"]*3)),regex=True)
    

    dict信息

    dict(zip(["LOCAL", "FOREIGN", "HELLO"], ["CORP"]*3))
    Out[585]: {'FOREIGN': 'CORP', 'HELLO': 'CORP', 'LOCAL': 'CORP'}
    

    您收到错误的原因,

    str.replace 不同于 replace

        3
  •  9
  •   Laurens Koppenol    6 年前

    @Rakesh的答案非常简洁,但不允许使用子字符串。不过,只要做一点小小的改变,就可以了。

    1. 使用替换词典,因为它使其更加通用
    2. 添加关键字参数 regex=True Series.replace() (不是 Series.str.replace )这实际上做了两件事:它将您的替换更改为regex替换,这更强大,但您必须转义特殊字符。当心这一点。其次,它将使replace处理子字符串,而不是整个字符串。这真的很酷!
    replacement = {
        "LOCAL": "CORP",
        "FOREIGN": "CORP",
        "HELLO": "CORP"
    }
    
    dataUS['sec_type'].replace(replacement, regex=True)
    

    完整代码示例

    dataUS = pd.DataFrame({'sec_type': ['LOCAL', 'Sample text LOCAL', 'Sample text LOCAL sample FOREIGN']})
    
    replacement = {
        "LOCAL": "CORP",
        "FOREIGN": "CORP",
        "HELLO": "CORP"
    }
    
    dataUS['sec_type'].replace(replacement, regex=True)
    

    输出

    0                            CORP
    1                            CORP
    2                Sample text CORP
    3    Sample text CORP sample CORP
    Name: sec_type, dtype: object
    
        4
  •  2
  •   Nuclear03020704    3 年前

    用于替换pandas系列中的多个值的函数:

    def replace_values(series, to_replace, value):
        for i in to_replace:
            series = series.str.replace(i, value)
        return series
    

    希望这对某人有帮助

        5
  •  1
  •   Cam    3 年前

    @如果你有一个很长的列表,JJP的答案是很好的。但是如果只有两个或三个,那么可以在模式中简单地使用“|”。确保添加 regex=True 参数

    清晰地 .str.strip() 这不是一项要求,但却是良好的实践。

    import pandas as pd
    
    df = pd.DataFrame({'A': ['LOCAL TEST', 'TEST FOREIGN', 'ANOTHER HELLO', 'NOTHING']})
    
    df['A'] = df['A'].str.strip().str.replace("LOCAL|FOREIGN|HELLO", "CORP", regex=True)
    

    输出

        A
    0   CORP TEST
    1   TEST CORP
    2   ANOTHER CORP
    3   NOTHING
    
        6
  •  0
  •   Rakesh    7 年前

    尝试:

    dataUS.replace({"sec_type": { 'LOCAL' : "CORP", 'FOREIGN' : "CORP"}})