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