Por ejemplo, tengo DF simple:
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)]})
¿Puedo seleccionar valores de 'A' para los cuales los valores correspondientes para 'B' serán mayores que 50, y para 'C' - no es igual a 900, usando métodos y expresiones idiomáticas de Pandas?
df.query
ypd.eval
parece que encaja bien en este caso de uso. Para obtener información sobre lapd.eval()
familia de funciones, sus características y casos de uso, visite Evaluación de expresión dinámica en pandas usando pd.eval () .Respuestas:
¡Por supuesto! Preparar:
Podemos aplicar operaciones de columna y obtener objetos de la serie booleana:
[Actualización, para cambiar a nuevo estilo
.loc
]:Y luego podemos usarlos para indexar en el objeto. Para el acceso de lectura, puede encadenar índices:
pero puede meterse en problemas debido a la diferencia entre una vista y una copia que hace esto para el acceso de escritura. Puedes usar
.loc
en su lugar:Tenga en cuenta que accidentalmente escribí
== 900
y no!= 900
, o~(df["C"] == 900)
, pero soy demasiado vago para arreglarlo. Ejercicio para el lector. : ^)fuente
.loc
actualización: sería bueno si aclara dónde obtenemos una copia y dónde una vista.{TypeError}cannot compare a dtyped [int64] array with a scalar of type [bool]
Otra solución es usar el método de consulta :
Ahora, si desea cambiar los valores devueltos en la columna A, puede guardar su índice:
.... y usar
.iloc
para cambiarlos, es decir:fuente
¡Y recuerda usar paréntesis!
Tenga en cuenta que el
&
operador tiene prioridad sobre los operadores como>
o<
etc. Es por eso queevalúa a
False
. Por lo tanto, si está utilizandopd.loc
, necesita poner corchetes alrededor de sus declaraciones lógicas, de lo contrario obtendrá un error. Por eso hacer:en vez de
lo que resultaría en
fuente
Puede usar pandas, tiene algunas funciones integradas para la comparación. Entonces, si desea seleccionar valores de "A" que se cumplan con las condiciones de "B" y "C" (suponiendo que desea recuperar un objeto pandas DataFrame)
df[['A']][df.B.gt(50) & df.C.ne(900)]
df[['A']]
le devolverá la columna A en formato DataFrame.La función pandas 'gt' devolverá las posiciones de la columna B que sean mayores que 50 y 'ne' devolverá las posiciones que no sean iguales a 900.
fuente