Ho un file csv che non arriva correttamente pandas.read_csv
quando filtro le colonne con usecols
e utilizzo più indici.
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
Mi aspetto che df1 e df2 dovrebbero essere gli stessi tranne per la colonna fittizia mancante, ma le colonne vengono etichettate male. Anche la data viene analizzata come una data.
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
Usare i numeri di colonna invece dei nomi mi dà lo stesso problema. Posso risolvere il problema rilasciando la colonna fittizia dopo il passaggio read_csv, ma sto cercando di capire cosa non va. Sto usando i panda 0.10.1.
modifica: corretto utilizzo errato dell'intestazione.
header
enames
non è corretto (ecco perché la prima riga manca nel tuo esempio. Siheader
aspetta un int (valore predefinito 0) come riga con l'intestazione. Perché dai "True" che viene interpretato come 1, la seconda riga (prima riga di dati) viene utilizzata come intestazione e manca. Tuttavia i nomi delle colonne sono corretti perché vengono sovrascritti con l'names
argomento. Ma puoi lasciarli entrambi e la prima riga viene utilizzata per i nomi delle colonne per impostazione predefinita. Tuttavia, non risolve la tua domanda iniziale.