Win*_*981 6 python regex replace pandas
如果整个字符串等于另一个字符串,我试图替换数据框中的字符串。我不想替换子字符串。
所以:
如果我有 df:
Index Name Age
0 Joe 8
1 Mary 10
2 Marybeth 11
Run Code Online (Sandbox Code Playgroud)
当整个字符串与“Amy”匹配“Mary”时,我想替换“Mary”,所以我得到
Index Name Age
0 Joe 8
1 Amy 10
2 Marybeth 11
Run Code Online (Sandbox Code Playgroud)
我正在执行以下操作:
df['Name'] = df['Name'].apply(lambda x: x.replace('Mary','Amy'))
Run Code Online (Sandbox Code Playgroud)
我从搜索中得到的理解是,replacesetregex=False的默认值replace 应该在数据框中查找整个值是“Mary”。相反,我得到这个结果:
Index Name Age
0 Joe 8
1 Amy 10
2 Amybeth 11
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?
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
Run Code Online (Sandbox Code Playgroud)
注意它们是不同的
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
解释:
当您像这样应用它时 - 您正在使用字符串,而不是 Pandas Series:
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
Run Code Online (Sandbox Code Playgroud)
它等同于:
In [44]: 'Marybeth'.replace('Mary','Amy')
Out[44]: 'Amybeth'
Run Code Online (Sandbox Code Playgroud)
解决方案:
正确使用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
Run Code Online (Sandbox Code Playgroud)
您可以显式指定regex=True,这将替换子字符串:
In [40]: df.Name.replace('Mary','Amy', regex=True)
Out[40]:
0 Joe
1 Amy
2 Amybeth
Name: Name, dtype: object
Run Code Online (Sandbox Code Playgroud)
注意:Series.str.replace(pat, repl, n=-1, case=None, flags=0)没有regex参数 - 它始终将patandrepl视为正则表达式:
In [41]: df.Name.str.replace('Mary','Amy')
Out[41]:
0 Joe
1 Amy
2 Amybeth
Name: Name, dtype: object
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3164 次 |
| 最近记录: |