2012-09-20 11 views
29

Ho una colonna in un DataFrame panda che vorrei suddividere su un unico spazio. La suddivisione è abbastanza semplice con DataFrame.str.split(' '), ma non riesco a creare una nuova colonna dall'ultima voce. Quando I .str.split() la colonna ottengo un elenco di matrici e non so come manipolare questo per ottenere una nuova colonna per il mio DataFrame.Ottieni l'ultima "colonna" dopo l'operazione .str.split() sulla colonna in pda DataFrame

Ecco un esempio. Ogni voce nella colonna contiene 'prezzo dei dati simbolo' e vorrei dividere il prezzo (e alla fine rimuovere la "p" ... o "c" nella metà dei casi).

import pandas as pd 
temp = pd.DataFrame({'ticker' : ['spx 5/25/2001 p500', 'spx 5/25/2001 p600', 'spx 5/25/2001 p700']}) 
temp2 = temp.ticker.str.split(' ') 

che produce

0 ['spx', '5/25/2001', 'p500'] 
1 ['spx', '5/25/2001', 'p600'] 
2 ['spx', '5/25/2001', 'p700'] 

Ma temp2[0] solo dà matrice propria voce dell'elenco e temp2[:][-1] fallisce. Come posso convertire l'ultima voce di ciascun array in una nuova colonna? Grazie!

risposta

28

è possibile utilizzare il metodo tolist come intermediario:

In [99]: import pandas as pd 

In [100]: d1 = pd.DataFrame({'ticker' : ['spx 5/25/2001 p500', 'spx 5/25/2001 p600', 'spx 5/25/2001 p700']}) 

In [101]: d1.ticker.str.split().tolist() 
Out[101]: 
[['spx', '5/25/2001', 'p500'], 
['spx', '5/25/2001', 'p600'], 
['spx', '5/25/2001', 'p700']] 

da cui si poteva fare una nuova dataframe:

In [102]: d2 = pd.DataFrame(d1.ticker.str.split().tolist(), 
    .....:     columns="symbol date price".split()) 

In [103]: d2 
Out[103]: 
    symbol  date price 
0 spx 5/25/2001 p500 
1 spx 5/25/2001 p600 
2 spx 5/25/2001 p700 

Per buona misura, si potrebbe fissare il prezzo:

In [104]: d2["price"] = d2["price"].str.replace("p","").astype(float) 

In [105]: d2 
Out[105]: 
    symbol  date price 
0 spx 5/25/2001 500 
1 spx 5/25/2001 600 
2 spx 5/25/2001 700 

PS: ma se si davvero vogliono solo l'ultima colonna, apply sarebbe sufficiente:

In [113]: temp2.apply(lambda x: x[2]) 
Out[113]: 
0 p500 
1 p600 
2 p700 
Name: ticker 
+0

Questo mi ha aiutato ad aggiungere un file di registro in panda che era troppo spaventoso e disordinato per persino toccare prima (una singola colonna di dati con molte informazioni per riga). – trench

+0

Tutti questi approcci hanno prestazioni disastrose rispetto alla risposta di Wes McKinney. –

+1

@JohnZwinck: wow, un downvote correlato solo alla prestazione su una risposta di cinque anni sulla funzionalità che era stata introdotta solo circa [due mesi prima] (https://github.com/pandas-dev/pandas/issues/1656)? Questo è .. rigoroso, te lo darò! – DSM

49

fare questo:

In [43]: temp2.str[-1] 
Out[43]: 
0 p500 
1 p600 
2 p700 
Name: ticker 
+3

Ama la soluzione pulita! – ericmjl

+4

dall'autore di "Pandas" :) – kmonsoor

+3

Amo questa soluzione, ma come funziona? Che cosa significa "dietro le quinte" che permette a 'str' seguito da parentesi per selezionare un elemento specifico dalla lista? –

0

Utilizzando Pandas 0.20.3:

In [10]: import pandas as pd 
    ...: temp = pd.DataFrame({'ticker' : ['spx 5/25/2001 p500', 'spx 5/25/2001 p600', 'spx 5/25/2001 p700']}) 
    ...: 

In [11]: temp2 = temp.ticker.str.split(' ', expand=True) # the expand=True return a DataFrame 

In [12]: temp2 
Out[12]: 
    0   1  2 
0 spx 5/25/2001 p500 
1 spx 5/25/2001 p600 
2 spx 5/25/2001 p700 

In [13]: temp3 = temp.join(temp2[2]) 

In [14]: temp3 
Out[14]: 
       ticker  2 
0 spx 5/25/2001 p500 p500 
1 spx 5/25/2001 p600 p600 
2 spx 5/25/2001 p700 p700 
Problemi correlati