Por exemplo, eu tenho DF simples:
import pandas as pd
from random import randint
df = pd.DataFrame({'A': [randint(1, 9) for x in xrange(10)],
'B': [randint(1, 9)*10 for x in xrange(10)],
'C': [randint(1, 9)*100 for x in xrange(10)]})
Posso selecionar valores de 'A' para os quais os valores correspondentes para 'B' serão maiores que 50 e para 'C' - não iguais a 900, usando métodos e expressões idiomáticas do Pandas?
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:
Certo! Configuração:
Podemos aplicar operações de coluna e obter objetos booleanos da série:
[Atualizar, para mudar para o novo estilo
.loc
]:E então podemos usá-los para indexar no objeto. Para acesso de leitura, você pode encadear índices:
mas você pode ter problemas devido à diferença entre uma visualização e uma cópia, fazendo isso para acesso de gravação. Você pode usar
.loc
:Note que eu digitei acidentalmente
== 900
e não!= 900
, ou~(df["C"] == 900)
, mas tenho preguiça de corrigi-lo. Exercício para o leitor. : ^)fonte
.loc
atualização - seria bom se você esclarecesse onde obtemos uma cópia e onde uma visualização.{TypeError}cannot compare a dtyped [int64] array with a scalar of type [bool]
Outra solução é usar o método de consulta :
Agora, se você quiser alterar os valores retornados na coluna A, salve o índice:
.... e use
.iloc
para alterá-los, ou seja:fonte
E lembre-se de usar parênteses!
Lembre-se de que o
&
operador tem precedência sobre operadores como>
ou<
etc. É por isso queavalia como
False
. Portanto, se você estiver usandopd.loc
, precisará colocar colchetes em torno de suas instruções lógicas, caso contrário, você receberá um erro. É por isso que:ao invés de
o que resultaria em
fonte
Você pode usar os pandas, que possuem algumas funções integradas para comparação. Portanto, se você deseja selecionar valores de "A" que sejam atendidos pelas condições de "B" e "C" (supondo que você deseje retornar um objeto pandas do DataFrame)
df[['A']][df.B.gt(50) & df.C.ne(900)]
df[['A']]
retornará a coluna A no formato DataFrame.A função 'gt' do panda retornará as posições da coluna B maiores que 50 e 'ne' retornará as posições diferentes de 900.
fonte