Панды, как фильтровать несколько последовательных подстрок

#python #pandas #string #dataframe

Вопрос:

Я хотел бы проверить, содержит ли столбец фрейма данных pandas id следующие подстроки '.F1', '.N1', '.FW', '.SP' .

В настоящее время я использую следующие коды:

 searchfor = ['.F1', '.N1', '.FW', '.SP']
mask = (df["id"].str.contains('|'.join(searchfor)))
 

id Колонка выглядит так:

                    ID
0  F611B4E369F1D293B5
1  10302389527F190F1A
 

На самом деле я хочу посмотреть id , содержит ли столбец четыре подстроки, начинающиеся с a . . По каким-то причинам F1 будут отфильтрованы. В текущем примере этого нет .F1 . Я был бы очень признателен, если бы кто-нибудь дал мне знать, как решить эту конкретную проблему. Огромное спасибо.

Комментарии:

1. . соответствует чему угодно. Таким образом, выражение .F1 будет любым, за которым последует F1 . Обе строки имеют этот шаблон. 9F1 в индексе 0 и 7F1 и 0F1 в индексе 1. Также неясно, как вы используете маску, так как она должна соответствовать обоим показанным идентификаторам.

2. Вы можете сбежать с '.F1' или с re.escape()

3. df["ID"].str.contains('\' '|\'.join(searchfor))

4. @AndrejKesely большое вам спасибо за предложение. Просто чтобы убедиться, что это будет побег с «.F1» в первом ряду, верно?

5. @SkipperLin Попробуй это searchfor = ['.F1', '.N1', '.FW', '.SP']

Ответ №1:

Вы можете использовать re.escape() для экранирования мета-символов регулярного выражения следующий способ, чтобы вам не нужно было экранировать каждую строку в списке слов searchfor (нет необходимости изменять определение searchfor ).:

 import re

searchfor = ['.F1', '.N1', '.FW', '.SP']            # no need to escape each string

pattern = '|'.join(map(re.escape, searchfor))       # use re.escape() with map()

mask = (df["id"].str.contains(pattern))
 

re.escape() будет экранировать каждую строку для вас:

 print(pattern)

'\.F1|\.N1|\.FW|\.SP'