Gostaria de filtrar de maneira limpa um quadro de dados usando o regex em uma das colunas.
Para um exemplo artificial:
In [210]: foo = pd.DataFrame({'a' : [1,2,3,4], 'b' : ['hi', 'foo', 'fat', 'cat']})
In [211]: foo
Out[211]:
a b
0 1 hi
1 2 foo
2 3 fat
3 4 cat
Quero filtrar as linhas para aquelas que começam com o f
uso de uma regex. Primeiro vá:
In [213]: foo.b.str.match('f.*')
Out[213]:
0 []
1 ()
2 ()
3 []
Isso não é muito útil. No entanto, isso me dará meu índice booleano:
In [226]: foo.b.str.match('(f.*)').str.len() > 0
Out[226]:
0 False
1 True
2 True
3 False
Name: b
Então eu poderia fazer minha restrição:
In [229]: foo[foo.b.str.match('(f.*)').str.len() > 0]
Out[229]:
a b
1 2 foo
2 3 fat
Isso me leva a colocar artificialmente um grupo na regex, e parece que talvez não seja o caminho limpo a seguir. Existe uma maneira melhor de fazer isso?
foo[foo.b.str.startswith("f")]
funcionará.foo[foo.b.str.match('(f.*)').str.len() > 0]
é uma solução bastante boa! Mais personalizável e útil do que o startwith, pois inclui a versatilidade do regex.foo[foo.b.str.match('f.*')]
funciona em pandas 0.24.2 para mim.Respostas:
Em vez disso, use contém :
fonte
df.loc[df.b.str.contains('^f'), :]
df[df.b.str.contains('^f'), :]
Já existe uma função de manipulação de string
Series.str.startswith()
. Você deveria tentarfoo[foo.b.str.startswith('f')]
.Resultado:
Eu acho o que você espera.
Como alternativa, você pode usar o contains com a opção regex. Por exemplo:
Resultado:
na=False
é evitar erros caso haja nan, valores nulos etc.fonte
df[~df.CITY.str.contains('~.*', regex= True, na=False)]
Pesquisa em várias colunas com quadro de dados:
fonte
frame
? e'C:\test\test.txt'
? Parece que você está respondendo a uma pergunta diferente.Pode ser um pouco tarde, mas agora é mais fácil fazer isso no Pandas. Você pode chamar match com
as_indexer=True
para obter resultados booleanos. Isso está documentado (junto com a diferença entrematch
econtains
) aqui .fonte
Obrigado pela ótima resposta @ user3136169, aqui está um exemplo de como isso pode ser feito também removendo os valores NoneType.
Também é possível adicionar regex como um argumento:
fonte
Escreva uma função booleana que verifique a regex e use apply na coluna
fonte
Usando
str
fatiafonte