在Pandas中,为什么以下内容不会替换任何包含感叹号的字符串及其后面的内容?
In [1]: import pandas as pd
In [2]: ser = pd.Series(['Aland Islands !Åland Islands', 'Reunion !Réunion', 'Zi
...: mbabwe'])
In [3]: ser
Out[3]:
0 Aland Islands !Åland Islands
1 Reunion !Réunion
2 Zimbabwe
dtype: object
In [4]: patt = r'.*!(.*)'
In [5]: repl = lambda m: m.group(1)
In [6]: ser.replace(patt, repl)
Out[6]:
0 Aland Islands !Åland Islands
1 Reunion !Réunion
2 Zimbabwe
dtype: object
尽管对匹配的子字符串的直接引用确实有效:
In [7]: ser.replace({patt: r'\1'}, regex=True)
Out[7]:
0 Åland Islands
1 Réunion
2 Zimbabwe
dtype: object
在第一种情况下我做错了什么?
答案 0 :(得分:0)
试试这个:
pattern = r'(。*)!'
ser.replace(pattern,'',regex = True)
在您的情况下,您没有设置regex = True,因为默认情况下它是假的。
答案 1 :(得分:0)
replace
似乎不支持将方法作为替换参数。因此,您所能做的就是隐式导入re
库并使用apply
:
>>> import re
>>> #... your code ...
>>> ser.apply(lambda row: re.sub(patt, repl, row))
0 Åland Islands
1 Réunion
2 Zimbabwe"
dtype: object
答案 2 :(得分:0)
Pandas中有两种get()
方法。
直接作用于Series的那个可以采用正则表达式模式字符串或编译的正则表达式并且可以就地执行,但不允许替换参数是可调用的。您必须设置fun get(): T {
if (!isSet) {
throw Error("Value not set")
}
@Suppress("unchecked_cast")
return value as T
}
并使用原始字符串。
使用:
replace
是:
regex=True
没有
import re
import pandas as pd
ser = pd.Series(['Aland Islands !Åland Islands', 'Reunion !Réunion', 'Zimbabwe'])
还有另一个,用作ser.replace(r'.*!(.*)', r'\1', regex=True, inplace=True)
ser.replace(r'.*!', '', regex=True, inplace=True)
regex = re.compile(r'.*!(.*)', inplace=True)
ser.replace(regex, r'\1', regex=True, inplace=True)
。这个接受一个可调用的替换,但不会就地替换而不采用repl = lambda m: m.group(1)
ser.replace(regex, repl, regex=True, inplace=True)
参数(尽管可以使用正则表达式模式字符串):
是:
Series.str.replace
没有
regex
我希望这对那里的人有帮助。