Rimozione della colonna indice nei panda durante la lettura di un csv


128

Ho il seguente codice che importa un file CSV. Ci sono 3 colonne e voglio impostare le prime due su variabili. Quando imposto la seconda colonna sulla variabile "efficienza", viene aggiunta anche la colonna indice. Come posso sbarazzarmi della colonna dell'indice?

df = pd.DataFrame.from_csv('Efficiency_Data.csv', header=0, parse_dates=False)
energy = df.index
efficiency = df.Efficiency
print efficiency

Ho provato a usare

del df['index']

dopo aver impostato

energy = df.index

che ho trovato in un altro post ma che risulta in "KeyError: 'index'"

Risposte:


70

DataFrames e Series hanno sempre un indice. Sebbene venga visualizzato accanto alle colonne, non è una colonna, motivo per cui del df['index']non ha funzionato.

Se vuoi sostituire l'indice con semplici numeri sequenziali, usa df.reset_index().

Per avere un'idea del motivo per cui l'indice è presente e di come viene utilizzato, vedere ad esempio 10 minuti per Panda .


1
Grazie! Ho deciso di importarlo in un modo diverso non usando i panda. Devo eseguire un po 'di aritmetica su ciascuna delle colonne e a Python non piaceva avere allegata la colonna dell'indice. Pandas è sicuramente il modo più semplice per importare dati ma non sempre il migliore che ho scoperto.
Bogdan Janiszewski

2
Hai provato a usare Pandas per fare l'aritmetica?
Jamie Bull

1
si può rimuovere il nome dell'indice?
Quant

3
Sì, index.name = None.
Dan Allan

1
@BogdanJaniszewski, se non hai usato i panda, perché l'hai accettata come risposta?
multigoodverse

250

Quando leggi da e verso il tuo file CSV, includi l'argomento, index=Falsequindi, ad esempio:

 df.to_csv(filename, index=False)

e da leggere dal csv

df.read_csv(filename, index=False)  

Ciò dovrebbe prevenire il problema, quindi non è necessario risolverlo in seguito.


8
Grazie mille Questo è esattamente ciò che la domanda sta cercando.
Pale Blue Dot

1
"header = False" funziona per rimuovere le intestazioni allo stesso modo
J.Dahlgren

29
dovrebbe essere index_col=False.
Vedda

1
L'utilizzo df.to_sql("table",cursor,if_exists="append",index=False)risolve anche l'errore sqlitesqlite3.OperationalError: table message has no column named index
Anna

1
@vedda sembra essere index=Falseper to_excel()e index_col=Falsecon read_csv()in panda 0.23.4. : - /
matt wilkie

70

df.reset_index(drop=True, inplace=True)


2
Questa è in realtà la mia soluzione preferita, ma non è una risposta molto elaborata. Il manuale legge questo sull'argomento drop: "Non provare a inserire l'indice nelle colonne del dataframe. Ciò reimposta l'indice sull'indice intero predefinito". pandas.pydata.org/pandas-docs/stable/generated/…
tommy.carstensen

@ tommy.carstensen Allora come eviterebbe di ottenere gli interi sull'indice in sostituzione dell'indice precedente? Penso che sia un malinteso del testo del tuo link. La domanda qui è abbandonare l'indice . E questo è raggiunto qui. Ottieni i numeri interi predefiniti, poiché non esiste un dataframe senza un indice, ma hai eliminato l'indice precedente. Ecco perché questa risposta dovrebbe essere la risposta accettata, anche perché utilizza la memoria efficiente inplace=True.
Lorenz

13

È possibile impostare una delle colonne come indice nel caso in cui sia un "id", ad esempio. In questo caso la colonna indice verrà sostituita da una delle colonne che hai scelto.

df.set_index('id', inplace=True)

3

Se il tuo problema è uguale al mio in cui vuoi solo ripristinare le intestazioni delle colonne da 0 alla dimensione della colonna. Fare

df = pd.DataFrame(df.values);

MODIFICARE:

Non è una buona idea se hai tipi di dati eterogenei. Meglio solo usare

df.columns = range(len(df.columns))

2

puoi specificare quale colonnaèun indice nel tuo file csv usando il parametro index_col della funzione from_csv se questo non risolve il tuo problema fornisci un esempio dei tuoi dati


2

Una cosa che faccio è df=df.reset_index() alloradf=df.drop(['index'],axis=1)


Errore: "etichette [" indice "] non contenute nell'asse"
Vasin Yuriy

@VasinYuriy significa df.reset_index().drop(columns=['yourfirstindex', 'yoursecondindex'])che funziona con "index" solo nel caso standard in cui l'indice non ha un nome e quindi diventa una colonna chiamata "index" con df.reset_index().drop(columns=['index']). Il parametro aggiunto axis=1è il valore predefinito. Questo metodo non è raccomandato, le reset_index(inplace=True)opere di @ SubhojitMukherjee "inplace" e quindi consentono di risparmiare memoria.
Lorenz
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.