Как запретить str.contains() искать подстроку?

Я хочу, чтобы Pandas искал в моем фрейме данных полную строку, а не подстроку. Вот минимальный рабочий пример, объясняющий мою проблему:

data = [['tom', 'wells fargo', 'retired'], ['nick', 'bank of america', 'partner'], ['juli', 'chase', 'director - oil well']]
 
# Create the pandas DataFrame
df = pd.DataFrame(data, columns=['Name', 'Place', 'Position'])
 
# print dataframe.
df
val = 'well'
df.loc[df.apply(lambda col: col.str.contains(val, case=False)).any(axis = "columns")]

Правильный код вернул бы только вторую строку, а не первую.

    Name    Place   Position
0   tom wells fargo retired
2   juli    chase   director - oil well

Обновление. Мое намерение состоит в том, чтобы выполнить поиск, который ищет точную запрошенную строку. При поиске «хорошо» алгоритм не должен извлекать «хорошо». Основываясь на комментариях, я понимаю, что мой вопрос может ввести в заблуждение.

"ну" тоже подстрока в "директор - нефтяная скважина" не так ли?

ali bakhtiari 10.01.2023 21:20

Действительно. Полагаю, я использую здесь неправильный термин. Я обновлю вопрос.

desert_ranger 10.01.2023 21:23
1
2
61
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

IIUC, вы можете использовать:

>>> df[~df['Position'].str.contains(fr'\b{val}\b')]

   Name        Place             Position
0   tom  wells fargo              retired
2  juli        chase  director - oil well

И для всех столбцов:

>>> df[~df.apply(lambda x: x.str.contains(fr'\b{val}\b', case=False)).any(axis=1)]

   Name        Place             Position
0   tom  wells fargo              retired
2  juli        chase  director - oil well

@desert_ranger. Я обновил свой ответ. Можете ли вы проверить второе решение, пожалуйста? Ключ в том, чтобы использовать '\b' для соответствия целому слову.

Corralien 10.01.2023 21:29

Якорь регулярного выражения \b, который является границей слова, — это то, что вам нужно.

Я добавил дополнительные данные в ваш код, чтобы проиллюстрировать больше:

import pandas as pd
data = [
          ['tom', 'wells fargo', 'retired']
        , ['nick', 'bank of america', 'partner']
        , ['john','bank of welly','blah']
        , ['jan','bank of somewell knwon','well that\'s it']
        , ['juli', 'chase', 'director - oil well']
        ]
 
# Create the pandas DataFrame
df = pd.DataFrame(data, columns=['Name', 'Place', 'Position'])
 
# print dataframe.
df
val = 'well'
df.loc[df.apply(lambda col: col.str.contains(fr"\b{val}\b", case=False)).any(axis = "columns")]

РЕДАКТИРОВАТЬ В Python3 строку можно заменить переменной с f перед " или ', а r будет выражать ее как регулярное выражение. Тогда теперь вы можете получить val, как хотите. Благодарим Вас за оценку

И вывод такой

Имя Место Позиция 3 Ян банк кого-то хорошо известного ну вот и все 4 Джули гнаться директор - нефтяная скважина

Вам не нужно избегать этого с помощью \\b. Вы можете просто избежать его с помощью r'\b`, это называется регулярным выражением необработанной строки. См. Регулярные выражения HOWTO: экранирование обратной косой черты или stackoverflow.com/questions/2081640/…

smci 10.01.2023 21:56

Другие вопросы по теме