Saltar al contenido

pandas read_csv y filtrar columnas con usecols

Solución:

La solución radica en comprender estos dos argumentos de palabras clave:

  • nombres solo es necesario cuando no hay una fila de encabezado en su archivo y desea especificar otros argumentos (como usecols) utilizando nombres de columna en lugar de índices enteros.
  • usecols se supone que proporciona un filtro antes de leer todo el DataFrame en la memoria; si se usa correctamente, nunca debería ser necesario eliminar columnas después de la lectura.

Entonces, debido a que tiene una fila de encabezado, pasando header=0 es suficiente y además pasa names parece ser confuso pd.read_csv.

Eliminando names de la segunda llamada da la salida deseada:

import pandas as pd
from StringIO import StringIO

csv = r"""dummy,date,loc,x
bar,20090101,a,1
bar,20090102,a,3
bar,20090103,a,5
bar,20090101,b,1
bar,20090102,b,3
bar,20090103,b,5"""

df = pd.read_csv(StringIO(csv),
        header=0,
        index_col=["date", "loc"], 
        usecols=["date", "loc", "x"],
        parse_dates=["date"])

Lo que nos da:

                x
date       loc
2009-01-01 a    1
2009-01-02 a    3
2009-01-03 a    5
2009-01-01 b    1
2009-01-02 b    3
2009-01-03 b    5

Este código logra lo que desea — también es extraño y ciertamente tiene errores:

Observé que funciona cuando:

a) especificas el index_col rel. a la cantidad de columnas que realmente usa, por lo que sus tres columnas en este ejemplo, no cuatro (suelta dummy y empezar a contar desde entonces)

b) lo mismo para parse_dates

c) no es así para usecols 😉 por obvias razones

d) aquí adapté el names para reflejar este comportamiento

import pandas as pd
from StringIO import StringIO

csv = """dummy,date,loc,x
bar,20090101,a,1
bar,20090102,a,3
bar,20090103,a,5
bar,20090101,b,1
bar,20090102,b,3
bar,20090103,b,5
"""

df = pd.read_csv(StringIO(csv),
        index_col=[0,1],
        usecols=[1,2,3], 
        parse_dates=[0],
        header=0,
        names=["date", "loc", "", "x"])

print df

que imprime

                x
date       loc   
2009-01-01 a    1
2009-01-02 a    3
2009-01-03 a    5
2009-01-01 b    1
2009-01-02 b    3
2009-01-03 b    5

Si su archivo csv contiene datos adicionales, las columnas se pueden eliminar del DataFrame después de la importación.

import pandas as pd
from StringIO import StringIO

csv = r"""dummy,date,loc,x
bar,20090101,a,1
bar,20090102,a,3
bar,20090103,a,5
bar,20090101,b,1
bar,20090102,b,3
bar,20090103,b,5"""

df = pd.read_csv(StringIO(csv),
        index_col=["date", "loc"], 
        usecols=["dummy", "date", "loc", "x"],
        parse_dates=["date"],
        header=0,
        names=["dummy", "date", "loc", "x"])
del df['dummy']

Lo que nos da:

                x
date       loc
2009-01-01 a    1
2009-01-02 a    3
2009-01-03 a    5
2009-01-01 b    1
2009-01-02 b    3
2009-01-03 b    5
¡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 *