Tengo un archivo csv que no aparece correctamente pandas.read_csvcuando filtro las columnas usecolsy 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 iguales excepto por la columna ficticia que falta, pero las columnas vienen mal etiquetadas. Además, 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
Usar números de columna en lugar de nombres me da el mismo problema. Puedo solucionar el problema eliminando la columna ficticia después del paso read_csv, pero estoy tratando de comprender qué es lo que está mal. Estoy usando pandas 0.10.1.
editar: se corrigió el mal uso del encabezado.
python
pandas
csv
csv-import
chip
fuente
fuente

headerynamesno es correcto (es por eso que falta la primera fila en su ejemplo.headerEspera un int (predeterminado 0) como la fila con el encabezado. Debido a que da "Verdadero", que se interpreta como 1, la segunda fila (la primera fila de datos) se usa como encabezado y falta. Sin embargo, los nombres de las columnas son correctos porque los sobrescribe con elnamesargumento. Pero ambos pueden dejarlos y la primera fila se usa para los nombres de las columnas de manera predeterminada. Sin embargo, no resuelve su pregunta inicial.usecolserror. ¿Posiblemente relacionado con el error 2654 ?Respuestas:
La respuesta de @chip pierde completamente el sentido de dos argumentos de palabras clave.
Esta solución corrige esas rarezas:
Lo que nos da:
fuente
header=0. Querría usarheader=Noney luego usarnamesademás.usecolscon índices enteros para las columnas que uno quiere mantener @Mack?Este código logra lo que desea --- también es extraño y ciertamente tiene errores:
Observé que funciona cuando:
a) especificas el
index_colrel. a la cantidad de columnas que realmente usa, por lo que son tres columnas en este ejemplo, no cuatro (sueltadummyy comienza a contar a partir de ese momento)b) lo mismo para
parse_datesc) no es así
usecols;) por razones obviasd) aquí adapté el
namespara reflejar este comportamientoque imprime
fuente
namesnúmeros y segúnusecolslos datos para que los datos fueran correctos.Si su archivo csv contiene datos adicionales, las columnas se pueden eliminar del DataFrame después de la importación.
Lo que nos da:
fuente
Solo tienes que agregar el
index_col=Falseparámetrofuente
importar csv primero y usar csv.DictReader es fácil de procesar ...
fuente