【问题标题】:Python Replace Whole Values in Dataframe String and Not SubstringsPython替换数据框字符串中的整个值而不是子字符串
【发布时间】:2018-06-21 05:50:09
【问题描述】:

如果整个字符串等于另一个字符串,我正在尝试替换数据框中的字符串。我不想替换子字符串。

所以:

如果我有 df:

 Index  Name       Age
   0     Joe        8
   1     Mary       10
   2     Marybeth   11

当整个字符串将“Mary”与“Amy”匹配时,我想替换“Mary”,所以我得到了

 Index  Name       Age
   0     Joe        8
   1     Amy        10
   2     Marybeth   11

我正在做以下事情:

df['Name'] = df['Name'].apply(lambda x: x.replace('Mary','Amy'))

我的搜索理解是replace 设置regex=Falsereplace 的默认值应该在数据框中寻找整个值是“玛丽”。相反,我得到了这个结果:

 Index  Name       Age
   0     Joe        8
   1     Amy        10
   2     Amybeth   11

我做错了什么?

【问题讨论】:

    标签: python regex pandas replace


    【解决方案1】:

    replace + dict 是要走的路(使用DataFrame,您正在使用Series.str.replace

    df['Name'].replace({'Mary':'Amy'})
    Out[582]: 
    0         Joe
    1         Amy
    2    Marybeth
    Name: Name, dtype: object
    df['Name'].replace({'Mary':'Amy'},regex=True)
    Out[583]: 
    0        Joe
    1        Amy
    2    Amybeth
    Name: Name, dtype: object
    

    注意它们是不同的

    Series: https://pandas.pydata.org/pandas-docs/stable/generated/pandas.Series.str.replace.html

    DataFrame: https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.replace.html

    【讨论】:

      【解决方案2】:

      您也可以使用loc 来定位名称完全匹配的实例,然后设置为新名称。

      df.loc[df['Name'] == 'Mary', 'Name'] = "Amy"
      

      【讨论】:

        【解决方案3】:

        说明:

        当您像这样应用它时 - 您正在使用字符串,而不是 Pandas 系列:

        In [42]: df['Name'].apply(lambda x: print(type(x)))
        <class 'str'>  # <---- NOTE
        <class 'str'>  # <---- NOTE
        <class 'str'>  # <---- NOTE
        Out[42]:
        0    None
        1    None
        2    None
        Name: Name, dtype: object
        

        同理:

        In [44]: 'Marybeth'.replace('Mary','Amy')
        Out[44]: 'Amybeth'
        

        解决方案:

        正确使用Series.replace(to_replace=None, value=None, inplace=False, limit=None, regex=False, method='pad', axis=None)(不带Series.apply())-默认情况下(regex=False)它将替换整个字符串-正如您所期望的那样:

        In [39]: df.Name.replace('Mary','Amy')
        Out[39]:
        0         Joe
        1         Amy
        2    Marybeth
        Name: Name, dtype: object
        

        您可以显式指定regex=True,这将替换子字符串:

        In [40]: df.Name.replace('Mary','Amy', regex=True)
        Out[40]:
        0        Joe
        1        Amy
        2    Amybeth
        Name: Name, dtype: object
        

        注意:Series.str.replace(pat, repl, n=-1, case=None, flags=0) 没有 regex 参数 - 它始终将 patrepl 视为正则表达式:

        In [41]: df.Name.str.replace('Mary','Amy')
        Out[41]:
        0        Joe
        1        Amy
        2    Amybeth
        Name: Name, dtype: object
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-02-13
          • 1970-01-01
          • 2021-02-22
          • 2021-12-14
          • 2019-12-28
          • 2021-11-23
          • 1970-01-01
          • 2021-06-13
          相关资源
          最近更新 更多