У меня есть DataFrame
с 4 столбцами, из которых 2 содержат строковые значения. Мне было интересно, если есть способ выбрать строки на основе частичного совпадения строк с конкретным столбцом?
Другими словами, функция или лямбда-функция, которая будет делать что-то вроде
re.search(pattern, cell_in_question)
возвращая логическое значение. Я знаком с синтаксисом, df[df['A'] == "hello world"]
но не могу найти способ сделать то же самое с частичным совпадением строк, скажем 'hello'
.
Кто-нибудь сможет указать мне правильное направление?
df[df['A'].str.contains("Hello|Britain")]
.str.contains
для использования.query()
API ?df[df['value'].astype(str).str.contains('1234.+')]
для фильтрации столбцов нестрокового типа.Я попробовал предлагаемое решение выше:
и получил ошибку:
Вы можете преобразовать значения NA в
False
, например:источник
df[df['A'].astype(str).str.contains("Hello|Britain")]
работал так жеЭтот пост предназначен для читателей, которые хотят
isin
)... и хотел бы узнать больше о том, какие методы предпочтительнее других.
(PS: я видел много вопросов на подобные темы, я думал, что было бы хорошо оставить это здесь.)
Основной поиск подстроки
str.contains
может использоваться для поиска по подстроке или по регулярному выражению. По умолчанию поиск выполняется на основе регулярных выражений, если вы явно не отключили его.Вот пример поиска на основе регулярных выражений,
Иногда поиск по регулярному выражению не требуется, поэтому укажите,
regex=False
чтобы отключить его.По производительности, поиск по регулярным выражениям медленнее, чем поиск по подстроке:
Избегайте использования поиска на основе регулярных выражений, если он вам не нужен.
Адресация
ValueError
sИногда выполнение поиска и фильтрации подстроки по результату приводит к
Обычно это происходит из-за смешанных данных или NaN в столбце вашего объекта,
На все, что не является строкой, не могут быть применены строковые методы, поэтому результатом будет NaN (естественно). В этом случае укажите
na=False
игнорировать нестроковые данные,Поиск нескольких подстрок
Этого легче всего достичь с помощью поиска регулярных выражений с использованием регулярного выражения OR.
Вы также можете создать список терминов, а затем присоединиться к ним:
Иногда разумно избегать ваших терминов, если в них есть символы, которые можно интерпретировать как метасимволы регулярных выражений . Если ваши термины содержат любой из следующих символов ...
Затем вам нужно использовать,
re.escape
чтобы избежать их:re.escape
имеет эффект экранирования специальных символов, поэтому они трактуются буквально.Совпадение всего слова
По умолчанию поиск подстроки выполняет поиск указанной подстроки / шаблона независимо от того, является ли это полным словом или нет. Чтобы сопоставлять только полные слова, нам нужно будет использовать здесь регулярные выражения - в частности, наш шаблон должен будет указать границы слов (
\b
).Например,
Теперь рассмотрим,
V / S
Множественный поиск по всему слову
Аналогично приведенному выше, за исключением того, что мы добавляем слово border (
\b
) к объединенному шаблону.Где это
p
выглядит,Отличная альтернатива: используйте списки !
Потому что ты можешь! И ты должен! Они обычно немного быстрее строковых методов, потому что строковые методы трудно векторизовать и обычно имеют зацикленные реализации.
Вместо,
Используйте
in
оператор внутри списка comp,Вместо,
Используйте
re.compile
(для кэширования вашего регулярного выражения) +Pattern.search
внутри списка comp,Если у «col» есть NaNs, то вместо
Использование,
Дополнительные параметры для частичного Струнный Matching:
np.char.find
,np.vectorize
,DataFrame.query
.В дополнение к
str.contains
списку и списку вы также можете использовать следующие альтернативы.np.char.find
Поддерживает только поиск по подстроке (читай: без регулярных выражений).
np.vectorize
Это обертка вокруг цикла, но с меньшими накладными расходами, чем у большинства
str
методов панд .Возможны решения Regex:
DataFrame.query
Поддерживает строковые методы через движок Python. Это не дает видимых преимуществ в производительности, но, тем не менее, полезно знать, нужно ли вам динамически генерировать ваши запросы.
Более подробную информацию о семействе методов
query
и ихeval
семействе можно найти в разделе «Оценка динамических выражений в пандах» с помощью pd.eval () .Рекомендуемое приоритетность использования
str.contains
, за его простоту и удобство обработки NaN и смешанных данныхnp.vectorize
df.query
источник
any(needle in haystack for needling in ['foo', 'bar'] and haystack in (df['col'], df['col2']))
и варианты я попробовал все удушье (это жалуетсяany()
и справедливо так ... Но документ блаженно неясно, как сделать такой запрос.df[['col1', 'col2']].apply(lambda x: x.str.contains('foo|bar')).any(axis=1)
Если кто-то задается вопросом, как выполнить связанную проблему: «Выбрать столбец по частичной строке»
Использование:
И чтобы выбрать строки путем частичного совпадения строк, перейдите
axis=0
к фильтру:источник
df.loc[:, df.columns.str.contains('a')]
df.filter(like='a')
Краткое примечание: если вы хотите сделать выбор на основе частичной строки, содержащейся в индексе, попробуйте следующее:
источник
Скажем, у вас есть следующее
DataFrame
:Вы всегда можете использовать
in
оператор в лямбда-выражении для создания вашего фильтра.Хитрость заключается в том, чтобы использовать
axis=1
опцию в,apply
чтобы передавать элементы в лямбда-функцию строка за строкой, а не столбец за столбцом.источник
Вот что я сделал для частичных совпадений строк. Если у кого-то есть более эффективный способ сделать это, пожалуйста, дайте мне знать.
источник
Использование содержимого не помогло моей строке со специальными символами. Найти работал, хотя.
источник
Если вам нужно сделать нечувствительны к регистру поиск строки в панд dataframe столбцов:
источник
Перед этим есть ответы, которые выполняют заданную функцию, в любом случае я хотел бы показать наиболее общий способ:
Таким образом, вы получите столбец, который ищите, каким бы образом он ни был написан.
(Очевидно, вы должны написать правильное выражение регулярного выражения для каждого случая)
источник
Может быть, вы хотите найти какой-то текст во всех столбцах кадра данных Pandas, а не только в их подмножестве. В этом случае поможет следующий код.
Предупреждение. Этот метод относительно медленный, хотя и удобный.
источник