2013-05-19 12 views
11

Ich habe eine Pandas Serie, die derzeit wie folgt aussieht:Pandas: Umformen Daten

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] 

Und ich will radikal in einen Datenrahmen neu zu gestalten, die ungefähr so ​​aussieht ...

 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 

dh. eine logische Konstruktion, die angibt, welchen Kategorien jede Beobachtung (Zeile) angehört.

Ich bin in der Lage zu schreiben für Schleife basierten Code, um das Problem anzugehen, aber angesichts der großen Anzahl von Zeilen, die ich behandeln muss, wird das sehr langsam sein.

Kennt jemand eine vektorisierte Lösung für diese Art von Problem? Ich wäre sehr dankbar.

EDIT: es gibt 509 Kategorien, die ich habe eine Liste von.

Antwort

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

Das, Sir, ist sehr, sehr schlau. –

+0

Herzlichen Glückwunsch zum goldenen Abzeichen! http://stackoverflow.com/help/badges/3296/pandas?userid=644898 –

+0

Können Sie erklären, wie das funktioniert? Wenn ich mir die einzelnen Serien anschaue, die z.B. Serie (1, Index = s [1]), Der Serienindex sind die Buchstaben in der Liste (wie ich es erwarten würde). Aber s.apply() liefert einen DataFrame mit den Serienindizes als Spalten. Wie ist der Drehpunkt passiert? – jdmarino