Eu tenho um DataFrame
com 4 colunas, das quais 2 contêm valores de seqüência de caracteres. Eu queria saber se havia uma maneira de selecionar linhas com base em uma correspondência de seqüência parcial contra uma coluna específica?
Em outras palavras, uma função ou função lambda que faria algo como
re.search(pattern, cell_in_question)
retornando um booleano. Estou familiarizado com a sintaxe de, df[df['A'] == "hello world"]
mas parece que não consigo encontrar uma maneira de fazer o mesmo com uma correspondência de string parcial, digamos 'hello'
.
Alguém seria capaz de me apontar na direção certa?
df[df['A'].str.contains("Hello|Britain")]
.str.contains
para usar.query()
api ?df[df['value'].astype(str).str.contains('1234.+')]
para filtrar colunas que não são do tipo string.Eu tentei a solução proposta acima:
e obteve um erro:
você pode transformar valores de NA em
False
, assim:fonte
df[df['A'].astype(str).str.contains("Hello|Britain")]
funcionou bemEste post é destinado a leitores que desejam
isin
)... e gostaria de saber mais sobre quais métodos devem ser preferidos a outros.
(PS: Eu já vi muitas perguntas sobre tópicos semelhantes, achei que seria bom deixar isso aqui.)
Pesquisa Básica de Substring
str.contains
pode ser usado para executar pesquisas de substring ou pesquisa baseada em regex. O padrão da pesquisa é baseado em regex, a menos que você a desative explicitamente.Aqui está um exemplo de pesquisa baseada em regex,
Às vezes, a pesquisa regex não é necessária, então especifique
regex=False
para desativá-la.Em termos de desempenho, a pesquisa regex é mais lenta que a pesquisa de substring:
Evite usar a pesquisa baseada em regex se você não precisar.
Endereçamento
ValueError
sÀs vezes, realizar uma pesquisa de substring e filtrar o resultado resultará em
Isso geralmente ocorre devido a dados mistos ou NaNs na coluna do objeto,
Qualquer coisa que não seja uma sequência não pode ter métodos de sequência aplicados, portanto o resultado é NaN (naturalmente). Nesse caso, especifique
na=False
para ignorar dados que não sejam de sequência,Pesquisa por várias seqüências de caracteres
Isso é mais facilmente alcançado por meio de uma pesquisa de regex usando o canal regex OR.
Você também pode criar uma lista de termos e juntá-los:
Às vezes, é aconselhável escapar dos seus termos, caso eles tenham caracteres que possam ser interpretados como metacaracteres de expressões regulares . Se seus termos contiverem um dos seguintes caracteres ...
Então, você precisará usar
re.escape
para escapar deles:re.escape
tem o efeito de escapar dos caracteres especiais para serem tratados literalmente.Correspondência de palavras inteiras
Por padrão, a pesquisa de substring procura o substring / padrão especificado, independentemente de ser palavra completa ou não. Para combinar apenas palavras completas, precisaremos usar expressões regulares aqui - em particular, nosso padrão precisará especificar limites de palavras (
\b
).Por exemplo,
Agora considere,
v / s
Pesquisa de Múltiplas Palavras Inteiras
Semelhante ao acima, exceto que adicionamos um limite de palavra (
\b
) ao padrão unido.Onde
p
fica assim,Uma ótima alternativa: use as compreensões da lista !
Porque você pode! E você deveria! Eles geralmente são um pouco mais rápidos que os métodos de string, porque os métodos de string são difíceis de vetorizar e geralmente têm implementações em loop.
Ao invés de,
Use o
in
operador dentro de uma lista comp,Ao invés de,
Use
re.compile
(para armazenar em cache seu regex) +Pattern.search
dentro de uma lista de composição,Se "col" tiver NaNs, em vez de
Usar,
Mais opções para Partial Matching string:
np.char.find
,np.vectorize
,DataFrame.query
.Além de
str.contains
e listar compreensões, você também pode usar as seguintes alternativas.np.char.find
Suporta apenas pesquisas de substring (leia-se: sem regex).
np.vectorize
Este é um invólucro em torno de um loop, mas com menos sobrecarga do que a maioria dos
str
métodos de pandas .Soluções Regex possíveis:
DataFrame.query
Suporta métodos de string por meio do mecanismo python. Isso não oferece benefícios visíveis de desempenho, mas é útil para saber se você precisa gerar dinamicamente suas consultas.
Mais informações
query
eeval
família de métodos podem ser encontradas em Avaliação de Expressão Dinâmica em pandas usando pd.eval () .Precedência de uso recomendada
str.contains
, por sua simplicidade e facilidade de manipulação de NaNs e dados mistosnp.vectorize
df.query
fonte
any(needle in haystack for needling in ['foo', 'bar'] and haystack in (df['col'], df['col2']))
e variações, tentei todos sufocar (queixa-seany()
e com razão ...) Mas o documento não é muito claro sobre como fazer essa consulta.df[['col1', 'col2']].apply(lambda x: x.str.contains('foo|bar')).any(axis=1)
Se alguém se perguntar como executar um problema relacionado: "Selecionar coluna por sequência parcial"
Usar:
E para selecionar linhas por correspondência parcial de string, passe
axis=0
para o filtro:fonte
df.loc[:, df.columns.str.contains('a')]
df.filter(like='a')
Nota rápida: se você deseja fazer a seleção com base em uma sequência parcial contida no índice, tente o seguinte:
fonte
Digamos que você tenha o seguinte
DataFrame
:Você sempre pode usar o
in
operador em uma expressão lambda para criar seu filtro.O truque aqui é usar a
axis=1
opção naapply
passagem de elementos para a função lambda linha por linha, em oposição a coluna por coluna.fonte
Aqui está o que eu acabei fazendo para correspondências parciais de string. Se alguém tiver uma maneira mais eficiente de fazer isso, entre em contato.
fonte
O uso de contains não funcionou bem para minha string com caracteres especiais. Encontre funcionou embora.
fonte
Antes disso, existem respostas que atendem ao recurso solicitado, de qualquer maneira, gostaria de mostrar da maneira mais geral:
Dessa forma, vamos obter a coluna que você procura, independentemente do caminho que for escrito.
(Obviusly, você deve escrever a expressão regex adequada para cada caso)
fonte
Talvez você queira procurar algum texto em todas as colunas do quadro de dados do Pandas, e não apenas no subconjunto deles. Nesse caso, o código a seguir ajudará.
Atenção. Este método é relativamente lento, embora conveniente.
fonte
Se você precisar fazer uma pesquisa sem distinção entre maiúsculas e minúsculas para uma sequência de caracteres em uma coluna de quadro de dados do pandas:
fonte