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.query
no 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
/loc
p.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 DataFrame
s 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ó.