name - python pandas plots
subconjunto de un DataFrame de Python (3)
Estoy en transición de R a Python. Solo comencé a usar Pandas. Tengo un código R que subconjuntos muy bien:
k1 <- subset(data, Product = p.id & Month < mn & Year == yr, select = c(Time, Product))
Ahora, quiero hacer cosas similares en Python. esto es lo que tengo hasta ahora:
import pandas as pd
data = pd.read_csv("../data/monthly_prod_sales.csv")
#first, index the dataset by Product. And, get all that matches a given ''p.id'' and time.
data.set_index(''Product'')
k = data.ix[[p.id, ''Time'']]
# then, index this subset with Time and do more subsetting..
Estoy empezando a sentir que estoy haciendo esto de la manera incorrecta. tal vez, hay una solución elegante. ¿Alguien puede ayudar? Necesito extraer mes y año de la marca de tiempo que tengo y hago subconjunto. Tal vez haya una sola línea que logre todo esto:
k1 <- subset(data, Product = p.id & Time >= start_time & Time < end_time, select = c(Time, Product))
Gracias.
Descubrí que puede usar cualquier condición de subconjunto para una columna dada envolviéndola en []. Por ejemplo, tiene un df con columnas [''Producto'', ''Tiempo'', ''Año'', ''Color'']
Y digamos que quieres incluir productos hechos antes de 2014. Podrías escribir,
df[df[''Year''] < 2014]
Para devolver todas las filas donde este es el caso. Puedes agregar diferentes condiciones.
df[df[''Year''] < 2014][df[''Color'' == ''Red'']
Luego, simplemente elija las columnas que desee como se indica arriba. Por ejemplo, el color y la clave del producto para el df anterior,
df[df[''Year''] < 2014][df[''Color'' == ''Red''][[''Product'',''Color'']]
Solo para alguien que busque una solución más similar a R:
df[(df.Product == p_id) & (df.Time> start_time) & (df.Time < end_time)][[''Time'',''Product'']]
No hay necesidad de data.loc
o query
, pero creo que es un poco largo.
DataFrame
que Time
y Product
son columnas en un DataFrame
, df
es una instancia de DataFrame
y que otras variables son valores escalares:
Por ahora, tendrá que hacer referencia a la instancia de DataFrame
:
k1 = df.loc[(df.Product == p_id) & (df.Time >= start_time) & (df.Time < end_time), [''Time'', ''Product'']]
Los paréntesis también son necesarios, debido a la precedencia del operador &
frente a los operadores de comparación. El operador &
es en realidad un operador bit a bit sobrecargado que tiene la misma precedencia que los operadores aritméticos que a su vez tienen una precedencia mayor que los operadores de comparación.
En pandas
0.13, un nuevo DataFrame.query()
experimental DataFrame.query()
estará disponible. Es extremadamente similar al módulo de subconjunto del argumento de select
:
Con query()
lo harías así:
df[[''Time'', ''Product'']].query(''Product == p_id and Month < mn and Year == yr'')
Aquí hay un ejemplo simple:
In [9]: df = DataFrame({''gender'': np.random.choice([''m'', ''f''], size=10), ''price'': poisson(100, size=10)})
In [10]: df
Out[10]:
gender price
0 m 89
1 f 123
2 f 100
3 m 104
4 m 98
5 m 103
6 f 100
7 f 109
8 f 95
9 m 87
In [11]: df.query(''gender == "m" and price < 100'')
Out[11]:
gender price
0 m 89
4 m 98
9 m 87
La consulta final que le interese incluso podrá aprovechar las comparaciones encadenadas, como esta:
k1 = df[[''Time'', ''Product'']].query(''Product == p_id and start_time <= Time < end_time'')