Saltar al contenido

Seleccionar columnas usando pandas dataframe.query()

Hacemos una verificación completa cada sección en nuestro espacio con la meta de mostrarte en todo momento información más veraz y actualizada.

Solución:

Después de jugar un rato con esto y leer el código fuente de DataFrame.queryno puedo encontrar una manera de hacerlo.

Si no es imposible, aparentemente al menos se desaconseja encarecidamente. Cuando surgió esta pregunta en github, el prolífico desarrollador/mantenedor de Pandas jreback sugirió usar df.eval() para seleccionar columnas y df.query() para filtrar en filas.


ACTUALIZAR:

javadba señala que el valor de retorno de eval no es un marco de datos. Por ejemplo, para desarrollar un poco más el ejemplo de jreback…

df.eval('A')

devuelve una Serie Pandas, pero

df.eval(['A', 'B'])

no regresa en DataFrame, devuelve una lista (de Pandas Series).

Por lo tanto, en última instancia, parece que la mejor manera de mantener la flexibilidad para filtrar filas y columnas es usar iloc/locp.ej

df.loc[0:4, ['A', 'C']]

producción

          A         C
0 -0.497163 -0.046484
1  1.331614  0.741711
2  1.046903 -2.511548
3  0.314644 -0.526187
4 -0.061883 -0.615978

Dataframe.query es más como el dónde cláusula en una instrucción SQL que el seleccionar parte.

import pandas as pd
import numpy as np
np.random.seed(123)
dates = pd.date_range('1/1/2000', periods=8)
df = pd.DataFrame(np.random.randn(8, 4), index=dates, columns=['A', 'B', 'C', 'D'])

Para seleccionar una columna o columnas puede usar lo siguiente:

df['A'] or df.loc[:,'A']

o

df[['A','B']] or df.loc[:,['A','B']]

Usar el .query método que haces algo como

df.query('A > B') lo que devolvería todas las filas donde el valor de la columna A es mayor que el valor de la columna b.

                   A         B         C         D
2000-01-03  1.265936 -0.866740 -0.678886 -0.094709
2000-01-04  1.491390 -0.638902 -0.443982 -0.434351
2000-01-05  2.205930  2.186786  1.004054  0.386186
2000-01-08 -0.140069 -0.861755 -0.255619 -2.798589

Lo cual es más legible en mi opinión que la selección de índice booleano con

df[df['A'] > df['B']]

pandasql

https://pypi.python.org/pypi/pandasql/0.1.0

Este es un ejemplo del siguiente blog http://blog.yhat.com/posts/pandasql-sql-for-pandas-dataframes.html . Las entradas son dos DataFrames meat y births : y este enfoque da la projections, filtering, aggregation y sorting esperado de sql.

@maxpower mencionó que este paquete tiene errores: así que veamos… Al menos el código del blog que se muestra a continuación funciona bien.

pysqldf = lambda q: sqldf(q, globals())

q  = """
SELECT
  m.date
  , m.beef
  , b.births
FROM
  meat m
LEFT JOIN
  births b
    ON m.date = b.date
WHERE
    m.date > '1974-12-31';
"""

meat = load_meat()
births = load_births()

df = pysqldf(q)

La salida es un panda. DataFrame como se desee.

Está funcionando muy bien para mi caso de uso particular (evaluarnos delitos)

odf = pysqldf("select %s from df where sweapons > 10 order by sweapons desc limit 10" %scols)
p('odfn', odf)

 odf
:    SMURDER  SRAPE  SROBBERY  SAGASSLT  SOTHASLT  SVANDLSM  SWEAPONS
0        0      0         0         1         1        10        54
1        0      0         0         0         1         0        52
2        0      0         0         0         1         0        46
3        0      0         0         0         1         0        43
4        0      0         0         0         1         0        33
5        1      0         2        16        28         4        32
6        0      0         0         7        17         4        30
7        0      0         0         0         1         0        29
8        0      0         0         7        16         3        29
9        0      0         0         1         0         5        28

Actualizar He hecho un montón de cosas con pandasql ahora: campos calculados, límites, alias, marcos de datos en cascada… es solo entonces productivo.

valoraciones y comentarios

Recuerda que te permitimos valorar este artículo si te ayudó.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *