A maioria das operações em pandas
pode ser realizada com o encadeamento de operador ( groupby
, aggregate
, apply
, etc.), mas a única maneira que eu verificou-se linhas de filtro é através de indexação suporte normais
df_filtered = df[df['column'] == value]
Isso não é atraente, pois exige que eu atribua df
a uma variável antes de poder filtrar seus valores. Existe algo mais como o seguinte?
df_filtered = df.mask(lambda x: x['column'] == value)
df.query
epd.eval
parece ser um bom ajuste para este caso de uso. Para obter informações sobre apd.eval()
família de funções, seus recursos e casos de uso, visite Avaliação de Expressão Dinâmica em pandas usando pd.eval () .Respostas:
Não tenho certeza do que você deseja e sua última linha de código também não ajuda, mas de qualquer maneira:
A filtragem "encadeada" é feita "encadeando" os critérios no índice booleano.
Se você deseja encadear métodos, pode adicionar seu próprio método de máscara e usá-lo.
fonte
(df.A == 1) & (df.D == 6)
, o "&" é um operador sobrecarregado no Pandas?pandas.
. Você deveriaimport pandas as pd
.import pandas as pd
é uma prática comum agora. Duvido que foi quando eu respondi a pergunta.Os filtros podem ser encadeados usando uma consulta do Pandas :
Os filtros também podem ser combinados em uma única consulta:
fonte
df.query('a in list([1,2])')
,s = set([1,2]); df.query('a in @s')
.A resposta do @lodagro é ótima. Eu o estenderia generalizando a função de máscara como:
Então você pode fazer coisas como:
fonte
DataFrame
s!Desde a versão 0.18.1, o
.loc
método aceita uma chamada para seleção. Juntamente com as funções lambda, você pode criar filtros encadeáveis muito flexíveis:Se tudo o que você está fazendo é filtrar, também pode omitir o
.loc
.fonte
Eu ofereço isso para exemplos adicionais. Esta é a mesma resposta que https://stackoverflow.com/a/28159296/
Adicionarei outras edições para tornar esta postagem mais útil.
pandas.DataFrame.query
query
foi feito exatamente para esse fim. Considere o quadro de dadosdf
Vamos usar
query
para filtrar todas as linhas ondeD > B
Que nós encadeamos
fonte
Eu tinha a mesma pergunta, exceto que queria combinar os critérios em uma condição OR. O formato fornecido por Wouter Overmeire combina os critérios em uma condição AND, de modo que ambos devem ser satisfeitos:
Mas descobri que, se você envolver cada condição
(... == True)
e associar os critérios a um pipe, os critérios serão combinados em uma condição OR, satisfeitos sempre que um deles for verdadeiro:fonte
df[(df.A==1) | (df.D==6)]
seria suficiente para o que você está tentando realizar?O pandas fornece duas alternativas à resposta de Wouter Overmeire, que não exigem nenhuma substituição. Um é
.loc[.]
com um callable, como emo outro é
.pipe()
, como emfonte
Minha resposta é semelhante às outras. Se você não quiser criar uma nova função, poderá usar o que os pandas já definiram para você. Use o método de tubulação.
fonte
a.join(b).pipe(lambda df: df[df.column_to_filter == 'VALUE'])
Se você deseja aplicar todas as máscaras booleanas comuns, bem como uma máscara de uso geral, pode agrupar o seguinte em um arquivo e simplesmente atribuir todas elas da seguinte maneira:
Uso:
É um pouco hacky, mas pode tornar as coisas um pouco mais limpas se você estiver cortando e alterando continuamente os conjuntos de dados de acordo com os filtros. Há também um filtro de uso geral adaptado de Daniel Velkov acima na função gen_mask que você pode usar com funções lambda ou, se desejar.
Arquivo a ser salvo (eu uso masks.py):
fonte
Essa solução é mais imprudente em termos de implementação, mas acho muito mais limpa em termos de uso, e certamente é mais geral do que as outras propostas.
https://github.com/toobaz/generic_utils/blob/master/generic_utils/pandas/where.py
Você não precisa baixar o repositório inteiro: salvando o arquivo e fazendo
deve ser suficiente. Então você o usa assim:
Um exemplo de uso um pouco menos estúpido:
A propósito: mesmo no caso em que você está apenas usando colunas booleanas,
pode ser muito mais eficiente do que
porque avalia
cond2
apenas ondecond1
estáTrue
.AVISO LEGAL: Eu dei essa resposta pela primeira vez em outro lugar porque não tinha visto isso.
fonte
Só quero adicionar uma demonstração usando
loc
para filtrar não apenas por linhas, mas também por colunas e alguns méritos à operação em cadeia.O código abaixo pode filtrar as linhas por valor.
Ao modificar um pouco, você também pode filtrar as colunas.
Então, por que queremos um método encadeado? A resposta é que é fácil ler se você tem muitas operações. Por exemplo,
fonte
parece funcionar: você também pode aninhar o
[]
operador. Talvez eles tenham adicionado desde que você fez a pergunta.fonte
df
agora não necessariamente faz referência à saída da parte anterior da cadeia.Se você configurar suas colunas para pesquisar como índices, poderá usar
DataFrame.xs()
uma seção transversal. Isso não é tão versátil quanto asquery
respostas, mas pode ser útil em algumas situações.fonte
Você também pode aproveitar a biblioteca numpy para operações lógicas. É bem rápido.
fonte