2013-05-19 16 views
11

Mam Series pandy, która obecnie wygląda tak:Pandy: przekształcanie danych

14 [Yellow, Pizza, Restaurants] 
... 
160920     [Automotive, Auto Parts & Supplies] 
160921  [Lighting Fixtures & Equipment, Home Services] 
160922     [Food, Pizza, Candy Stores] 
160923   [Hair Removal, Nail Salons, Beauty & Spas] 
160924   [Hair Removal, Nail Salons, Beauty & Spas] 

I chcę radykalnie przekształcić go w dataframe, który wygląda mniej więcej tak ...

 Yellow Automotive Pizza 
14  1   0  1 
…   
160920 0   1  0 
160921 0   0  0 
160922 0   0  1 
160923 0   0  0 
160924 0   0  0 

to znaczy. logiczna konstrukcja z zaznaczeniem, które kategorie obejmuje każda obserwacja (wiersz).

Jestem w stanie napisać kod oparty na pętli, aby rozwiązać problem, ale biorąc pod uwagę dużą liczbę wierszy, które muszę obsłużyć, będzie to bardzo powolne.

Czy ktoś zna wektoryzowane rozwiązanie tego rodzaju problemu? Byłbym bardzo wdzięczny.

EDYCJA: istnieje 509 kategorii, które mam listę.

Odpowiedz

27
In [9]: s = Series([list('ABC'),list('DEF'),list('ABEF')]) 

In [10]: s 
Out[10]: 
0  [A, B, C] 
1  [D, E, F] 
2 [A, B, E, F] 
dtype: object 

In [11]: s.apply(lambda x: Series(1,index=x)).fillna(0) 
Out[11]: 
    A B C D E F 
0 1 1 1 0 0 0 
1 0 0 0 1 1 1 
2 1 1 0 0 1 1 
+9

To, proszę pana, jest bardzo, bardzo sprytne. –

+0

gratulacje na złotej odznace! http://stackoverflow.com/help/badges/3296/pandas?userid=644898 –

+0

Czy możesz wyjaśnić, jak to działa? Kiedy patrzę na poszczególne tworzone serie, np. Seria (1, indeks = s [1]), Indeks serii to litery na liście (jak można się spodziewać). Ale s.apply() daje DataFrame z indeksami serii jako kolumny. Jak doszło do obrotu? – jdmarino

Powiązane problemy