2012-09-20 7 views
29

Mam kolumnę w DataFrame pandy, którą chciałbym podzielić na pojedynczym miejscu. Podział jest dość prosty z DataFrame.str.split(' '), ale nie mogę utworzyć nowej kolumny z ostatniego wpisu. Kiedy I .str.split() kolumna otrzymuję listę tablic i nie wiem jak to manipulować, aby uzyskać nową kolumnę dla mojej DataFrame.Pobierz ostatnią kolumnę po operacji .str.split() na kolumnie w pandach DataFrame

Oto przykład. Każdy wpis w kolumnie zawiera "cenę danych symbol" i chciałbym oddzielić cenę (i ostatecznie usunąć "p" ... lub "c" w połowie przypadków).

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(' ') 

który daje

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

Ale temp2[0] prostu daje tablicę jednej liście startowej i temp2[:][-1] zawiedzie. Jak mogę przekonwertować ostatni wpis w każdej tablicy na nową kolumnę? Dzięki!

Odpowiedz

28

Można użyć metody tolist jako pośrednik:

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']] 

Z którego można zrobić nowy 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 

środek na dobre, można ustalić cenę:

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: ale jeśli jesteś naprawdę prostu chcesz ostatnią kolumnę, apply wystarczyłby:

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

To właśnie pomogło mi dodać plik dziennika w pandach, które były zbyt przerażające i niechlujne, aby dotykać wcześniej (pojedyncza kolumna danych z dużą ilością informacji w rzędzie). – trench

+0

Wszystkie te podejścia mają fatalną skuteczność w porównaniu z odpowiedzią Wesa McKinneya. –

+1

@JohnZwinck: wow, downstream na temat wydajności tylko na pięcioletnią odpowiedź na temat funkcjonalności, która została wprowadzona tylko około [dwa miesiące wcześniej] (https://github.com/pandas-dev/pandas/issues/1656)? To jest ... rygorystyczne, dam ci to! – DSM

49

Wykonaj:

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

Uwielbiam czyste rozwiązanie! – ericmjl

+4

od autora "Pandy" :) – kmonsoor

+3

Uwielbiam to rozwiązanie, ale jak to działa? Czy to, co dzieje się "za kulisami", pozwala "str", a następnie nawiasie, na wybór konkretnego elementu z listy? –

0

Korzystanie Pandy 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 
Powiązane problemy