Ausgabe
Ich habe einen Datenrahmen, in dem eine Spalte eine Liste von Gruppen ist, zu denen jeder meiner Benutzer gehört. Etwas wie:
index groups
0 ['a','b','c']
1 ['c']
2 ['b','c','e']
3 ['a','c']
4 ['b','e']
Und was ich tun möchte, ist eine Reihe von Dummy-Spalten zu erstellen, um zu identifizieren, zu welchen Gruppen jeder Benutzer gehört, um einige Analysen durchzuführen
index a b c d e
0 1 1 1 0 0
1 0 0 1 0 0
2 0 1 1 0 1
3 1 0 1 0 0
4 0 1 0 0 0
pd.get_dummies(df['groups'])
wird nicht funktionieren, weil das nur eine Spalte für jede andere Liste in meiner Spalte zurückgibt.
Die Lösung muss effizient sein, da der Datenrahmen mehr als 500.000 Zeilen enthalten wird.
Lösung
Verwendung s
für Ihre df['groups']
:
In [21]: s = pd.Series({0: ['a', 'b', 'c'], 1:['c'], 2: ['b', 'c', 'e'], 3: ['a', 'c'], 4: ['b', 'e'] })
In [22]: s
Out[22]:
0 [a, b, c]
1 [c]
2 [b, c, e]
3 [a, c]
4 [b, e]
dtype: object
Dies ist eine mögliche Lösung:
In [23]: pd.get_dummies(s.apply(pd.Series).stack()).sum(level=0)
Out[23]:
a b c e
0 1 1 1 0
1 0 0 1 0
2 0 1 1 1
3 1 0 1 0
4 0 1 0 1
Die Logik dahinter ist:
.apply(Series)
konvertiert die Reihe von Listen in einen Datenrahmen.stack()
fügt alles wieder in eine Spalte ein (erzeugt einen mehrstufigen Index)pd.get_dummies( )
Erstellen der Dummies.sum(level=0
) zum erneuten Zusammenführen der verschiedenen Zeilen, die eine Zeile sein sollten (durch Summieren der zweiten Ebene, wobei nur die ursprüngliche Ebene beibehalten wird (level=0
))
Ein leichtes Äquivalent istpd.get_dummies(s.apply(pd.Series), prefix='', prefix_sep='').sum(level=0, axis=1)
Ob dies effizient genug ist, weiß ich nicht, aber wenn Leistung wichtig ist, ist das Speichern von Listen in einem Datenrahmen auf jeden Fall keine sehr gute Idee.
Beantwortet von – joris
Antwort geprüft von – Katrina (FixError Volunteer)