Filtrar datos al cargar CSV usando Pandas

publicado por: Anonymous

Estoy cargando archivos muy grandes de CSV donde hay información que no utilizo. Lo que hago actualmente es pasar a listas y luego fitrar con condiciones.

Por ejemplo, en una columna tengo “A” y “B” pero solo quiero aquellas filas que tienen “A”, por lo tanto filtro los “B” y lo hago para todas las demás listas que cargo desde Pandas. Creo que es muy ineficiente lo que estoy haciendo, de cargar con Pandas y luego convertir las columnas a listas para filtrarlas.

Existe alguna manera más eficiente de filtrar los datos.
Yo cargo los datos de esta forma en Pandas:

   import pandas as pd
   df = pd.read_csv('C:\Users\4209456\Downloads\TECNICO\BBDD FD.csv', header=0, sep=';',parse_dates = ['Date'],dayfirst = True)

y luego creo listas de algunas columnas:

   FD=df["FD Text"]
   Fecha=pd.to_datetime(df["Date"],dayfirst = True)

De ahí para ambas listas filtro según una condición de la lista “FD”, creando otra lista “FD2”, dentro de la condición tengo la lista “Fecha” creando una lista corregida “Fecha2”. De esta forma tengo las listas que necesito para comenzar mi código que son “FD2” y “Fecha2”, manteniendo las posiciones originales de los datos que quedaron de la filtración.

solución

Hay varias formas de filtrar filas en Pandas, lo más simple es crear una máscara (array de booleanos) usando un condicional sobre la columna en cuestión y posteriormente filtrar las filas del Dataframe con ella. Básicamente es el procedimiento que se sigue en NumPy para filtrar arrays. A esto se le conoce como indexación booleana.

Podemos crear un pequeño ejemplo para verlo:

import pandas as pd
from io import StringIO

data = StringIO('''
Nombre,Edad,Sexo,Fecha
Juan,12,M,20/08/2017
Laura,21,F,24/07/2017
Pedro,53,M,13/01/2017
María,17,F,15/03/2017
Luís,19,M,15/07/2017
Miguel,23,M,14/08/2017
''')

df = pd.read_csv(data, header=0, parse_dates = ['Fecha'], dayfirst = True)

Tenemos por tanto el siguiente Dataframe:

>>> df

   Nombre  Edad Sexo      Fecha
0    Juan    12    M 2017-08-20
1   Laura    21    F 2017-07-24
2   Pedro    53    M 2017-01-13
3   María    17    F 2017-03-15
4    Luís    19    M 2017-07-15
5  Miguel    23    M 2017-08-14

Podemos filtrar usando la columna sexo para obtener otro Dataframe que solo contenga las filas correspondientes a mujeres simplemente haciendo:

>>> df2 = df[df['Sexo'] == 'F']
>>> df

  Nombre  Edad Sexo      Fecha
1  Laura    21    F 2017-07-24
3  María    17    F 2017-03-15

Con df['Sexo'] == 'F' simplemente se crea una máscara que en este caso es una serie de Pandas y que contiene una única columna de booleanos: [False, True, False, True, False, False] resultado de comparar si cada valor de la columna es igual a 'F'. Podemos filtrar con cualquier otro iterable de valores boleanos, por ejemplo un array de NumPy, una lista, una columna de otro DataFrame, etc.

Otro ejemplo, filtrando los que tienen 18 años o más:

>>> df2 = df[df['Edad'] >= 18]

>>> df2

   Nombre  Edad Sexo      Fecha
1   Laura    21    F 2017-07-24
2   Pedro    53    M 2017-01-13
4    Luís    19    M 2017-07-15
5  Miguel    23    M 2017-08-14

Edición:

Puedes filtrar por fechas siguiendo la misma idea, por ejemplo podemos filtrar las fila con Fecha entre la fecha actual y 30 días atrás:

>>> fecha_limite = pd.datetime.now().date() - pd.Timedelta(days=30)
>>> df2 = df[(df['Fecha'] > fecha_limite)]
>>> df2

   Nombre  Edad Sexo      Fecha
0    Juan    12    M 2017-08-20
1   Laura    21    F 2017-07-24
5  Miguel    23    M 2017-08-14

También se pueden usar varias condiciones, por ejemplo la condición anterior pero que además sea mujer:

>>> fecha_limite = pd.datetime.now().date() - pd.Timedelta(days=30)
>>> df2 = df[(df['Fecha'] > fecha_limite) & (df['Sexo'] == 'F')]
>>> df2

  Nombre  Edad Sexo      Fecha
1  Laura    21    F 2017-07-24

Se puede filtrar usando el índice de la misma forma o usando loc, por ejemplo, si nuestra columna Fecha fuera en índice del DataFrame (DateTimeIndex) podemos hacer:

>>> fecha_limite = pd.datetime.now().date() - pd.Timedelta(days=30)
>>> df2 = df[df.index.date > fecha_limite]
Respondido por: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *