2015-10-20 14 views
20

Sono un po 'nuovo per i panda. Ho un frame di dati panda che è 1 riga per 23 colonne.Converti frame dati panda in serie

Voglio convertire questo in una serie? Mi chiedo quale sia il modo più pitonioso per fare questo?

Ho provato pd.Series(myResults) ma si lamenta ValueError: cannot copy sequence with size 23 to array axis with dimension 1. Non è abbastanza intelligente da rendersi conto che è ancora un "vettore" in termini matematici.

Grazie!

risposta

15

Non è abbastanza intelligente da rendersi conto che è ancora un "vettore" in termini matematici.

Dire piuttosto che è abbastanza intelligente da riconoscere una differenza di dimensionalità. :-)

Penso che la cosa più semplice che si può fare è selezionare quella riga posizionale utilizzando iloc, che ti dà una serie con le colonne come il nuovo indice ed i valori come valori:

>>> df = pd.DataFrame([list(range(5))], columns=["a{}".format(i) for i in range(5)]) 
>>> df 
    a0 a1 a2 a3 a4 
0 0 1 2 3 4 
>>> df.iloc[0] 
a0 0 
a1 1 
a2 2 
a3 3 
a4 4 
Name: 0, dtype: int64 
>>> type(_) 
<class 'pandas.core.series.Series'> 
+0

Oppure, un altro modo: 'df.T' – ako

+4

@ako:' df.T' non produce una serie, però, solo un dataframe trasposto. – DSM

+1

buon punto. OP ha chiesto una serie. – ako

17

È possibile trasporre il dataframe a riga singola (che risulta ancora in un dataframe) e quindi i valori squeeze in una serie (l'inverso di to_frame).

df = pd.DataFrame([list(range(5))], columns=["a{}".format(i) for i in range(5)]) 

>>> df.T.squeeze() 
a0 0 
a1 1 
a2 2 
a3 3 
a4 4 
Name: 0, dtype: int64 
+4

Nota che ho riscontrato un piccolo problema usando 'squeeze'. Per un dataframe di forma '(1, 1)' ritornerà, non una serie di lunghezza 1, ma uno scalare numpico. Questo ha portato a un bug difficile da catturare quando si utilizzava "squeeze" su oggetti di lunghezza sconosciuta (ad esempio con 'groupby'). – IanS

+1

"Grazie! Df.squeeze() ha funzionato quando df.iloc [:, 0] & df.ix [:, 0] hanno prodotto troppi errori di indici" – Afflatus