Python替换Dataframe字符串和非子字符串中的整个值

时间:2018-01-11 19:53:20

标签: python regex pandas replace

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

所以:

如果我有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 的默认值应该在数据框中查找整个值为“Mary” ”。相反,我得到了这个结果:

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

我做错了什么?

3 个答案:

答案 0 :(得分:4)

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

注意他们是不同的

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

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

答案 1 :(得分:2)

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

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

答案 2 :(得分:1)

<强>解释

当您像这样应用它时 - 您正在使用字符串,而不是使用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视为RegEx&#39;:

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