Obtener y filtrar datos de un dataframe
mayo 03, 2015Obtener y filtrar datos de un dataframe¶
Existen varios métodos para seleccionar los datos requeridos de un dataframe. Cuando se maneja gran cantidad de datos es importante el método que se usa, puesto que algunos son mas eficientes que otros. Se usará un dataframe creado a partir de datos creados al azar para mostrar las diferencias entre los métodos.
In [2]:
import pandas as pd
import random
import numpy as np
import datetime as dt
In [3]:
# Se generan datos de ejemplo, un dataframe de 4 columnas y 1000 filas
rnd_1 = [random.randrange(1,20) for x in xrange(1000)]
rnd_2 = [random.randrange(1,20) for x in xrange(1000)]
rnd_3 = [random.randrange(1,20) for x in xrange(1000)]
fecha = pd.date_range('2012-4-10', '2015-1-4')
data = pd.DataFrame({'fecha':fecha, 'rnd_1': rnd_1, 'rnd_2': rnd_2, 'rnd_3': rnd_3})
Alguna información general sobre el dataframe creado
In [4]:
data.describe()
Out[4]:
Filtro booleano¶
Es posible filtrar cualquier columna a partir de la comparación con un dato de referencia, por ejemplo, se filtran las filas para valores de la columna rnd_1 menores o iguales a 5.
In [5]:
data_filter = data[data['rnd_1'] <= 5]
# Se visualizan los primeros diez datos resultantes del filtro
data_filter.head(10)
Out[5]:
Se pueden realizar dos filtros simultáneos: Se seleccionan las filas cuyos valores de la columna 'rnd_2' son iguales a 2 y los valores de la columna 'rnd_3' son mayores que 15
In [6]:
data[(data['rnd_2'] == 2) & (data['rnd_3'] > 15)]
Out[6]:
Los siguientes métodos usan el índice para seleccionar los datos, por lo que en ocasiones se requiere tomar la columna sobre la que se quiere filtrar la información y convertirla en el índice del dataframe. Para esto se usará el método set_index.
set_index
Argumentos:
keys: Nombre de la columna que se convertirá en índice. string
drop: Elimina la columna que se usará como índice. False por defecto.
append: Sirve para conservar el índice que tiene el dataframe y agregarle uno nuevo. False por defecto.
inplace: Modifica el dataframe sobre el que se trabaja, no crea copia. False por defecto.
Argumentos:
keys: Nombre de la columna que se convertirá en índice. string
drop: Elimina la columna que se usará como índice. False por defecto.
append: Sirve para conservar el índice que tiene el dataframe y agregarle uno nuevo. False por defecto.
inplace: Modifica el dataframe sobre el que se trabaja, no crea copia. False por defecto.
Método loc¶
Se seleccionan los datos del 2 al 4 en el índice y las columnas 'rnd_2' y fecha
In [7]:
data.loc[2:4, ['rnd_2', 'fecha']]
Out[7]:
Para seleccionar los datos entre dos fechas determinadas
In [8]:
data_fecha = data.set_index('fecha')
data_fecha.head()
Out[8]:
Se seleccionan los datos desde el 2013-04-14 a 2013-04-18
In [23]:
# Se crean las fechas con la librería datetime
fecha_1 = dt.datetime(2013, 4, 14)
fecha_2 = dt.datetime(2013, 4, 18)
# Filtro por fecha
data_fecha.loc[fecha_1: fecha_2]
Out[23]:
Para usar este método los valores del filtro, en este caso fecha_1 y fecha_2, deben estar en el índice del dataframe
Para seleccionar un valor del dataframe
In [10]:
data_fecha.loc[fecha_1,'rnd_1']
Out[10]:
Método at¶
Funciona de la misma forma que el método loc, siendo at un método de acceso rápido a un dato
In [11]:
data_fecha.at[fecha_1,'rnd_1']
Out[11]:
In [12]:
timeit data_fecha.at[fecha_1,'rnd_1']
In [13]:
timeit data_fecha.loc[fecha_1,'rnd_1']
Método iloc¶
Con el método iloc no importan cuales sean los valores del índice, este selecciona por la posición. Por ejemplo para seleccionar los datos de la posición 10 a 15:
In [14]:
data_fecha[10: 15]
Out[14]:
Las columnas también son referidas por posición con números enteros comenzando desde el 0
In [15]:
# Se seleccionan las columnas rnd_2 y rnd_3 y se imprimen los primeros 5 datos
# En este caso los dos puntos quiere decir que se seleccionan todas las filas
data_fecha.iloc[:,[1,2]].head()
Out[15]:
Se seleccionan las filas 1, 12, 34 y las columnas 0 y 2
In [16]:
data_fecha.iloc[[1,12,34],[0,2]]
Out[16]:
Se usa la misma notación si se quiere seleccionar un solo valor y no un dataframe
In [17]:
data_fecha.iloc[1,0]
Out[17]:
Método iat¶
Funciona de la misma forma que el método iloc, siendo iat un método de acceso rápido a un dato
In [18]:
data_fecha.iat[1,0]
Out[18]:
In [19]:
timeit data_fecha.iat[1,0]
In [20]:
timeit data_fecha.iloc[1,0]
Método ix¶
Este método facilita la selección de datos, puesto que permite filtrar con valores que no se encuentran en el dataframe. Los datos de la columna fecha fueron creados desde '2012-4-10' hasta '2015-1-4' con el formato aaaa-mm-dd. Si se necesita hacer un filtro con dos fechas que tienen la hora, los métodos anteriores no son de utilidad puesto que estos valores no se encuentran en el índice.
In [21]:
fecha_1 = dt.datetime(2013, 1, 10, 8, 30)
fecha_2 = dt.datetime(2013, 1, 13, 4, 20)
# Filtro por fecha
data_fecha.ix[fecha_1: fecha_2]
Out[21]:
Como se ve en el dataframe resultante el dato de la fecha 2013-01-10 no se toma porque se considera previo al rango de fechas dado.
7 comments
Este comentario ha sido eliminado por el autor.
ResponderEliminarDispongo de un DataFrame en el que las etiquetas de filas son fechas con el formato '2012-01-31'. ¿Cómo podría filatralo para obtener solamente los registros del mes de fecbrero, por ejemplo "2012-2". Agradeceré su ayuda.
ResponderEliminarHola Akitxu, podés crear una columna con solo el valor de los meses:
Eliminardata['mes'] = data['fecha'].dt.month
y luego seleccionar solo los registros del mes que quiere:
data[data['mes'] == 2].
Si lo requiere con año puede hacer el mismo proceso para crear una columna con los años y luego en el filtro agregas un condicional para seleccionar año
data[(data['mes'] == 2) & (data['año'] == 2012)]
Este post está para una versión de python 2. Pronto publicaré las versiones de python 3 (ya puedes ver las de mejoras visuales en matplotlib actualizadas). Saludos.
Lo he solucionado con:
Eliminarprint (msft.loc["2015-01", :])
Muchas gracias
VC_CODPERIODO NB_CRED VC_CURSO VC_CODCARR
ResponderEliminar2C 6 1 GIF
2C 6 1 GIF
2C 6 1 GIF
2C 6 1 GIF
2C 6 1 GIF
2C 6 1 GIF
1C 6 1 GIF
1C 6 1 GIF
1C 6 1 GIF
1C 6 1 GIF
1C 6 1 GIF
1C 6 1 GIF
1C 6 1 GIF
1C 6 1 GIF
1C 6 1 GIF
1C 6 1 GIF
1C 6 1 GIF
1C 6 1 GIF
1C 6 1 GIF
1C 6 1 GIF
1C 6 1 GIF
1C 6 1 GIF
1C 6 1 GIF
1C 6 1 GIF
1C 6 1 GIF
1C 6 1 GIF
1C 6 1 GIF
1C 6 1 GIF
1C 6 1 GIF
1C 6 1 GIF
1C 6 1 GIF
1C 6 1 GIF
1C 6 1 GIF
1C 6 1 GIF
1C 6 1 GIF
1C 6 1 GIF
1C 6 1 GIF
1C 6 1 GIF
1C 6 1 GIF
1C 6 1 GIF
1C 6 1 GIF
1C 6 1 GIF
1C 6 1 GIF
1C 6 1 GIF
1C 6 1 GIF
1C 6 1 GIF
1C 6 1 GIF
1C 6 1 GIF
1C 6 1 GIF
1C 6 1 GIF
1C 6 1 GIF
1C 6 1 GIF
1C 6 1 GIF
1C 6 1 GIF
1C 6 1 GIF
1C 6 1 GIF
1C 6 1 GIF
1C 6 1 GIF
1C 6 1 GIF
1C 6 1 GIF
1C 6 1 GIF
1C 6 1 GIF
1C 6 1 GIF
1C 6 1 GIF
1C 6 1 GIF
1C 6 1 GIF
1C 6 1 GIF
1C 6 1 GIF
1C 6 1 GIF
1C 6 1 GIF
1C 6 1 GIF
1C 6 1 GIF
1C 6 1 GIF
1C 6 1 GIF
1C 6 1 GIF
1C 6 1 GIF
1C 6 1 GIF
1C 6 1 GIF
1C 6 1 GIF
1C 6 1 GIF
1C 6 1 GIF
1C 6 1 GIF
1C 6 1 GIF
1C 6 1 GIF
1C 6 1 GIF
1C 6 1 GIF
1C 6 1 GIF
1C 6 1 GIF
1C 6 1 GIF
1C 6 1 GIF
1C 6 1 GIF
AN 6 2 GIF
Hola me pueden ayudar necesito filtrar de la primera columna los valores que se solo sean 1C y 2C EN PHYTON
Suponiendo que este dataframe se llama "data" basta con agregar dos condicionales en el filtro:
Eliminardata[(data['VC_CODPERIODO'] == '1C') | (data['VC_CODPERIODO'] == '2C')]
Tengo un dataframe pandas con columnas con datos str y otras con float, necesito encontrar los datos negativos y llenarlos con la media.
ResponderEliminar