Tengo un archivo csv que no aparece correctamente pandas.read_csv
cuando filtro las columnas 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 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
header
ynames
no es correcto (es por eso que falta la primera fila en su ejemplo.header
Espera 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 elnames
argumento. 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.usecols
error. ¿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=None
y luego usarnames
además.usecols
con í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_col
rel. a la cantidad de columnas que realmente usa, por lo que son tres columnas en este ejemplo, no cuatro (sueltadummy
y comienza a contar a partir de ese momento)b) lo mismo para
parse_dates
c) no es así
usecols
;) por razones obviasd) aquí adapté el
names
para reflejar este comportamientoque imprime
fuente
names
números y segúnusecols
los 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=False
parámetrofuente
importar csv primero y usar csv.DictReader es fácil de procesar ...
fuente