9

Фильтрация DataFrame pandas по критериям подстроки

7

Я имею DataFrame в pandas с колонкой строковых значений. Мне нужно выбрать строки на основе частичного совпадения строк.

Что-то вроде этого идиома:

re.search(pattern, cell_in_question)

который возвращает булево значение. Я знаком с синтаксисом df[df['A'] == "hello world"], но не могу найти способ сделать то же самое с частичным совпадением строки, например, с 'hello'.

5 ответ(ов)

3

Ошибка, которую вы получили, связана с тем, что метод 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)]

Это должно решить вашу проблему, и код будет работать, не выдавая ошибок.

0

Если кто-то интересуется, как решить связанную задачу: "Выбрать столбец по частичному совпадению строки", вы можете использовать следующее:

df.filter(like='hello')  # выбирает столбцы, содержащие слово hello

А для выбора строк с частичным совпадением строки передайте параметр axis=0 в метод filter:

# выбирает строки, которые содержат слово hello в метке индекса
df.filter(like='hello', axis=0)  
0

Краткое замечание: если вы хотите выполнять выборку на основе подстроки, содержащейся в индексе, попробуйте следующий код:

df['stridx'] = df.index
df[df['stridx'].str.contains("Hello|Britain")]

Этот код сначала создает новый столбец stridx, который содержит значения индекса, а затем фильтрует DataFrame, выбирая строки, в которых индекс содержит либо "Hello", либо "Britain".

0

Если вам нужно выполнить поиск строки без учета регистра в колонке DataFrame pandas, вы можете использовать метод str.contains() с параметром case=False. Вот пример кода, который иллюстрирует, как это сделать:

df[df['A'].str.contains("hello", case=False)]

В этом примере мы ищем все строки в колонке 'A', которые содержат слово "hello", игнорируя регистр. Обратите внимание, что параметр case=False делает поиск нечувствительным к регистру, что полезно, если вы не уверены в регистре введенного слова.

0

Вопрос: У меня есть следующий 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, что позволяет передавать элементы в лямбда-функцию построчно, а не по столбцам.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь