read_csv - python pandas read csv example
pandas read_csv y columnas de filtro con usecols (4)
Este código logra lo que quieres, también es extraño y sin dudas:
Observé que funciona cuando:
a) especifica el index_col
rel. a la cantidad de columnas que realmente usa, por lo que son tres columnas en este ejemplo, no cuatro (se quita la dummy
y se comienza a contar a partir de ese momento)
b) lo mismo para parse_dates
c) no es así para usecols
;) por razones obvias
d) aquí he adaptado los 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
Tengo un archivo csv que no entra correctamente con pandas.read_csv
cuando filtro las columnas con usecols
y uso varios índices.
import pandas as pd
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"""
f = open(''foo.csv'', ''w'')
f.write(csv)
f.close()
df1 = pd.read_csv(''foo.csv'',
header=0,
names=["dummy", "date", "loc", "x"],
index_col=["date", "loc"],
usecols=["dummy", "date", "loc", "x"],
parse_dates=["date"])
print df1
# Ignore the dummy columns
df2 = pd.read_csv(''foo.csv'',
index_col=["date", "loc"],
usecols=["date", "loc", "x"], # <----------- Changed
parse_dates=["date"],
header=0,
names=["dummy", "date", "loc", "x"])
print df2
Espero que df1 y df2 sean los mismos excepto por la columna ficticia faltante, pero las columnas vienen mal etiquetadas. También la fecha se analiza como una fecha.
In [118]: %run test.py
dummy x
date loc
2009-01-01 a bar 1
2009-01-02 a bar 3
2009-01-03 a bar 5
2009-01-01 b bar 1
2009-01-02 b bar 3
2009-01-03 b bar 5
date
date loc
a 1 20090101
3 20090102
5 20090103
b 1 20090101
3 20090102
5 20090103
Utilizar números de columna en lugar de nombres me da el mismo problema. Puedo resolver el problema dejando caer la columna ficticia después del paso read_csv, pero estoy tratando de entender qué está pasando mal. Estoy usando pandas 0.10.1.
editar: se corrigió el mal uso del encabezado.
La respuesta de @chip omite por completo el argumento de dos argumentos clave.
- los nombres solo son necesarios cuando no hay encabezado y desea especificar otros argumentos usando nombres de columna en lugar de índices enteros.
- Se supone que usecols proporciona un filtro antes de leer todo el DataFrame en la memoria; si se utiliza correctamente, nunca debe haber necesidad de eliminar columnas después de leer.
Esta solución corrige esas rarezas:
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
Primero importe csv y use csv.DictReader es fácil de procesar ...
Si su archivo csv contiene datos adicionales, las columnas pueden deleted 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