如果整个字符串等于另一个字符串,我试图替换数据帧中的字符串。我不想替换子串。
所以:
如果我有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=False
和replace
的默认值应该在数据框中查找整个值为“Mary” ”。相反,我得到了这个结果:
Index Name Age
0 Joe 8
1 Amy 10
2 Amybeth 11
我做错了什么?
答案 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
注意他们是不同的
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
答案 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
参数 - 它始终将pat
和repl
视为RegEx&#39;:
In [41]: df.Name.str.replace('Mary','Amy')
Out[41]:
0 Joe
1 Amy
2 Amybeth
Name: Name, dtype: object