Я хочу, чтобы 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
Обновление. Мое намерение состоит в том, чтобы выполнить поиск, который ищет точную запрошенную строку. При поиске «хорошо» алгоритм не должен извлекать «хорошо». Основываясь на комментариях, я понимаю, что мой вопрос может ввести в заблуждение.
Действительно. Полагаю, я использую здесь неправильный термин. Я обновлю вопрос.
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' для соответствия целому слову.
Якорь регулярного выражения \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, как хотите. Благодарим Вас за оценку
И вывод такой
Вам не нужно избегать этого с помощью \\b. Вы можете просто избежать его с помощью r'\b`, это называется регулярным выражением необработанной строки. См. Регулярные выражения HOWTO: экранирование обратной косой черты или stackoverflow.com/questions/2081640/…
"ну" тоже подстрока в "директор - нефтяная скважина" не так ли?