2013-10-23 11 views
7

Come posso aggiungere un'intestazione a un DF senza sostituire quella corrente? In altre parole, voglio solo spostare l'intestazione attuale verso il basso e aggiungerla al dataframe come un altro record.Pandas Dataframe aggiunge intestazione senza sostituire l'intestazione corrente

* domanda secondaria: come si aggiungono le tabelle (esempio di dataframe) alla domanda di stackoverflow?

ho questo (intestazione nota e come è appena aggiunto come una riga:

0.213231 0.314544 
0 -0.952928 -0.624646 
1 -1.020950 -0.883333 

Ho bisogno di questo (tutti gli altri record sono spostati verso il basso e viene aggiunto un nuovo record) (anche: non potevo 't leggere il csv correttamente perché sto utilizzando s3_text_adapter per l'importazione e non riuscivo a capire come avere un argomento che ignora intestazione simile a panda read_csv):

 A   B 
0 0.213231 0.314544 
1 -1.020950 -0.883333 
+1

Per le tabelle, è sufficiente copiare e incollare il testo repr, quindi assicurarsi di evidenziare e CTRL + K/indent 4 spazi (inserendolo nella formattazione del codice). –

+0

Che cos'è s3_text_adapter e come lo stai usando? Dovrebbe * avere un'intestazione = Nessuna opzione ... –

+0

http://docs.continuum.io/iopro/TextAdapter.html – horatio1701d

risposta

11

Un'altra opzione è quella di aggiungerlo come un ulteriore livello dell'indice della colonna, per renderlo un MultiIndex:

In [11]: df = pd.DataFrame(randn(2, 2), columns=['A', 'B']) 

In [12]: df 
Out[12]: 
      A   B 
0 -0.952928 -0.624646 
1 -1.020950 -0.883333 

In [13]: df.columns = pd.MultiIndex.from_tuples(zip(['AA', 'BB'], df.columns)) 

In [14]: df 
Out[14]: 
     AA  BB 
      A   B 
0 -0.952928 -0.624646 
1 -1.020950 -0.883333 

Questo ha il vantaggio di mantenere le dtypes corretti per il dataframe, in modo da poter ancora fare calcoli veloci e corrette sul vostro dataframe, e vi permette di accedere da entrambi i nomi vecchi e nuovi della colonna.

.

Per completezza, ecco (risposta cancellato) di DSM, rendendo le colonne fila, che, come già detto, di solito non è una buona idea:

In [21]: df_bad_idea = df.T.reset_index().T 

In [22]: df_bad_idea 
Out[22]: 
       0   1 
index   A   B 
0  -0.952928 -0.624646 
1  -1.02095 -0.883333 

nota, il DTYPE può cambiare (se queste sono i nomi delle colonne piuttosto che valori corretti) come in questo caso ... quindi state attenti se effettivamente intenzione di fare qualsiasi lavoro su questo come sarà probabilmente più lenta e può anche fallire:

In [23]: df.sum() 
Out[23]: 
A -1.973878 
B -1.507979 
dtype: float64 

In [24]: df_bad_idea.sum() # doh! 
Out[24]: Series([], dtype: float64) 

Se i nomi di colonna sono a Di solito una riga che è stata scambiata come riga di intestazione, quindi è necessario correggere questo in lettura nei dati (ad es. read_csv utilizza header=None).

+0

Ho intenzione di eliminare il mio a favore di questo, perché penso che il tuo punto sul cambio di dtype sia buono. – DSM

+0

@ DSM lo fai sempre dopo I +1! Era quello che l'OP era dopo, ma questo è più corretto credo (anche se potrebbe/dovrebbe essere più facile) ... –

+0

Grazie. Questo è veramente bello e buono a sapersi, ma intendevo come sostituire l'intestazione "A" e "B" dal primo df sopra ma anche solo aggiungere i valori "A" e "B" come un'altra riga, in altre parole spostare valori 'A' e 'B' in basso all'indice 0 come nuovo primo record in df. – horatio1701d