Фильтрация DataFrame pandas по критериям подстроки
Я имею DataFrame в pandas с колонкой строковых значений. Мне нужно выбрать строки на основе частичного совпадения строк.
Что-то вроде этого идиома:
re.search(pattern, cell_in_question)
который возвращает булево значение. Я знаком с синтаксисом df[df['A'] == "hello world"]
, но не могу найти способ сделать то же самое с частичным совпадением строки, например, с 'hello'
.
5 ответ(ов)
Ошибка, которую вы получили, связана с тем, что метод str.contains()
возвращает серию булевых значений, в которой могут быть значения NA
или NaN
. Когда вы пытаетесь индексировать датафрейм с помощью этой серии, pandas поднимает ошибку, так как не позволяет индексировать с помощью вектора, содержащего NA
или NaN
значения.
Чтобы избежать этой проблемы, вы можете использовать метод fillna()
, чтобы заменить значения NaN
на False
перед индексированием. Вот как это можно сделать:
df[df['A'].str.contains("Hello|Britain", na=False)]
Параметр na=False
гарантирует, что все значения NaN
будут интерпретированы как False
, что позволит избежать ошибки при индексации.
Таким образом, исправленный код будет выглядеть следующим образом:
df[df['A'].str.contains("Hello|Britain", na=False)]
Это должно решить вашу проблему, и код будет работать, не выдавая ошибок.
Если кто-то интересуется, как решить связанную задачу: "Выбрать столбец по частичному совпадению строки", вы можете использовать следующее:
df.filter(like='hello') # выбирает столбцы, содержащие слово hello
А для выбора строк с частичным совпадением строки передайте параметр axis=0
в метод filter:
# выбирает строки, которые содержат слово hello в метке индекса
df.filter(like='hello', axis=0)
Краткое замечание: если вы хотите выполнять выборку на основе подстроки, содержащейся в индексе, попробуйте следующий код:
df['stridx'] = df.index
df[df['stridx'].str.contains("Hello|Britain")]
Этот код сначала создает новый столбец stridx
, который содержит значения индекса, а затем фильтрует DataFrame, выбирая строки, в которых индекс содержит либо "Hello", либо "Britain".
Если вам нужно выполнить поиск строки без учета регистра в колонке DataFrame pandas, вы можете использовать метод str.contains()
с параметром case=False
. Вот пример кода, который иллюстрирует, как это сделать:
df[df['A'].str.contains("hello", case=False)]
В этом примере мы ищем все строки в колонке 'A', которые содержат слово "hello", игнорируя регистр. Обратите внимание, что параметр case=False
делает поиск нечувствительным к регистру, что полезно, если вы не уверены в регистре введенного слова.
Вопрос: У меня есть следующий DataFrame
:
>>> df = pd.DataFrame([['hello', 'hello world'], ['abcd', 'defg']], columns=['a','b'])
>>> df
a b
0 hello hello world
1 abcd defg
Как я могу проверить, содержится ли строка из одного столбца в строке другого столбца для каждой строки?
Ответ: Вы можете использовать оператор in
в выражении lambda
, чтобы создать фильтр. Вот как это можно сделать:
>>> df.apply(lambda x: x['a'] in x['b'], axis=1)
0 True
1 False
dtype: bool
Здесь трюк заключается в использовании параметра axis=1
в методе apply
, что позволяет передавать элементы в лямбда-функцию построчно, а не по столбцам.
Объединение двух столбцов текста в DataFrame pandas
Как выбрать строки из DataFrame на основе значений столбцов?
Создание DataFrame в Pandas путём последовательного добавления строк
Преобразование списка словарей в DataFrame pandas
Получение списка из заголовков столбцов DataFrame в Pandas