Замена строк с помощью регулярных выражений с использованием Pandas - PullRequest
0 голосов
/ 25 апреля 2018

Почему в 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

Что я делаю не так в первом случае?

Ответы [ 3 ]

0 голосов
/ 25 апреля 2018

Похоже, что 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
0 голосов
/ 26 апреля 2018

В Пандах есть два 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 (хотя могут использоваться строки шаблона регулярного выражения):

Да:

ser.str.replace(r'.*!', '')
ser.str.replace(r'.*!(.*)', r'\1')
ser.str.replace(regex, repl)
нет

Нет

ser.str.replace(regex, r'\1')
ser.str.replace(r'.*!', '', inplace=True)

Надеюсь, это кому-нибудь пригодится.

0 голосов
/ 25 апреля 2018

Попробуйте это:

pattern = r '(. *)!'

ser.replace (pattern, '', regex = True)

В вашем случае вы не установили regex = True, поскольку по умолчанию оно равно false.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...