tutorial read_csv read into index functions example python pandas csv csv-import

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