La mayoría de las operaciones en pandas
que se puede lograr con el encadenamiento de operador ( groupby
, aggregate
, apply
, etc.), pero la única manera que he encontrado para las filas de filtro es a través de la indexación de soporte de la normalidad
df_filtered = df[df['column'] == value]
Esto no es atractivo, ya que requiere asignar df
a una variable antes de poder filtrar sus valores. ¿Hay algo más como lo siguiente?
df_filtered = df.mask(lambda x: x['column'] == value)
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:
No estoy completamente seguro de lo que quieres, y tu última línea de código tampoco ayuda, pero de todos modos:
El filtrado "encadenado" se realiza "encadenando" los criterios en el índice booleano.
Si desea encadenar métodos, puede agregar su propio método de máscara y usarlo.
fuente
(df.A == 1) & (df.D == 6)
, ¿es el "&" un operador sobrecargado en Pandas?pandas.
. Que debieraimport pandas as pd
.import pandas as pd
es una práctica común ahora. Dudo que fuera cuando respondí la pregunta.Los filtros se pueden encadenar mediante una consulta Pandas :
Los filtros también se pueden combinar en una sola consulta:
fuente
df.query('a in list([1,2])')
,s = set([1,2]); df.query('a in @s')
.La respuesta de @lodagro es genial. Lo ampliaría generalizando la función de máscara como:
Entonces puedes hacer cosas como:
fuente
DataFrame
s!Desde la versión 0.18.1, el
.loc
método acepta un llamado para selección. Junto con las funciones lambda, puede crear filtros encadenables muy flexibles:Si todo lo que está haciendo es filtrar, también puede omitir el
.loc
.fuente
Ofrezco esto para ejemplos adicionales. Esta es la misma respuesta que https://stackoverflow.com/a/28159296/
Agregaré otras ediciones para que esta publicación sea más útil.
pandas.DataFrame.query
query
fue hecho exactamente para este propósito. Considere el marco de datosdf
Usemos
query
para filtrar todas las filas dondeD > B
Que encadenamos
fuente
Tenía la misma pregunta, excepto que quería combinar los criterios en una condición OR. El formato proporcionado por Wouter Overmeire combina los criterios en una condición AND de modo que ambos deben cumplirse:
Pero descubrí que, si envuelve cada condición
(... == True)
y une los criterios con una tubería, los criterios se combinan en una condición OR, satisfecha siempre que cualquiera de ellos sea cierto:fuente
df[(df.A==1) | (df.D==6)]
sería suficiente para lo que estás tratando de lograr?pandas ofrece dos alternativas a la respuesta de Wouter Overmeire que no requieren ninguna anulación. Uno es
.loc[.]
con un invocable, como enel otro es
.pipe()
, como enfuente
Mi respuesta es similar a las demás. Si no desea crear una nueva función, puede usar lo que los pandas ya han definido para usted. Usa el método de la tubería.
fuente
a.join(b).pipe(lambda df: df[df.column_to_filter == 'VALUE'])
Si desea aplicar todas las máscaras booleanas comunes, así como una máscara de uso general, puede arrojar lo siguiente en un archivo y luego simplemente asignarlas todas de la siguiente manera:
Uso:
Es un poco hacky pero puede hacer las cosas un poco más limpias si continuamente está cortando y cambiando los conjuntos de datos según los filtros. También hay un filtro de propósito general adaptado de Daniel Velkov arriba en la función gen_mask que puede usar con funciones lambda o de lo contrario si lo desea.
Archivo para guardar (uso masks.py):
fuente
Esta solución es más agresiva en términos de implementación, pero me parece mucho más limpia en términos de uso, y ciertamente es más general que las otras propuestas.
https://github.com/toobaz/generic_utils/blob/master/generic_utils/pandas/where.py
No necesita descargar el repositorio completo: guardar el archivo y hacer
Debería ser suficiente. Entonces lo usas así:
Un ejemplo de uso un poco menos estúpido:
Por cierto: incluso en el caso de que solo estés usando col booleanos,
puede ser mucho más eficiente que
porque evalúa
cond2
dóndecond1
estáTrue
.DESCARGO DE RESPONSABILIDAD: Primero di esta respuesta en otro lugar porque no había visto esto.
fuente
Solo quiero agregar una demostración usando
loc
para filtrar no solo por filas sino también por columnas y algunos méritos a la operación encadenada.El siguiente código puede filtrar las filas por valor.
Modificándolo un poco, también puede filtrar las columnas.
Entonces, ¿por qué queremos un método encadenado? La respuesta es que es fácil de leer si tiene muchas operaciones. Por ejemplo,
fuente
parece funcionar: también puede anidar el
[]
operador. Tal vez lo agregaron ya que usted hizo la pregunta.fuente
df
ahora no necesariamente hace referencia a la salida de la parte anterior de la cadena.Si configura sus columnas para buscar como índices, puede usar
DataFrame.xs()
para tomar una sección transversal. Esto no es tan versátil como lasquery
respuestas, pero podría ser útil en algunas situaciones.fuente
También puede aprovechar la biblioteca numpy para operaciones lógicas. Es bastante rápido
fuente