2017-12-29 5 views
0

Diese Frage ähnelt this one, aber es gibt einen Unterschied: hier habe ich anstelle eines einzelnen Wertes eine Liste von Werten in einer Spalte von Datenrahmen.Effiziente Art und Weise eine Art von Ein-Hot-Codierung in Pandas zu tun

Nehmen wir an, wir haben einen Pandas-Datenrahmen mit einer Spalte namens words. Es enthält den Index der Wörter, die in einem Dokument verfügbar sind. Im folgenden Datenfeld gibt es beispielsweise zwei Dokumente, in denen das erste die Wörter ['a','b'] und das zweite ['a','c','d'] enthält.

df = pd.DataFrame() 
df['words'] = [['a','b'],['a','c','d']] 

Ich möchte die words Spalte verschiedene binäre Spalten konvertieren, eine Spalte für jedes Wort. Die obige Datenrahmen wird auf umgerechnet werden:

df['a'] = [True, True] 
df['b'] = [True, False] 
df['c'] = [False, True] 
df['d'] = [False, True] 

Vorerst habe ich den folgenden Code, wo es verschiedene Wörter w verfügbar iteriert in der words Spalte.

df[w] = [w in word_list for word_list in df['words']] 

Offensichtlich ist es sehr langsam. Gibt es einen effizienten Weg, dies zu tun?

+0

Sie können [diese Lösung] überprüfen möchten (https://stackoverflow.com/a/45684296/5741205) – MaxU

Antwort

2

Eine Möglichkeit wäre get_dummies

In [31]: pd.get_dummies(df.words.apply(pd.Series).stack()).sum(level=0).astype(bool) 
Out[31]: 
     a  b  c  d 
0 True True False False 
1 True False True True 

andere Art und Weise verwenden, vorausgesetzt, Sie haben nicht | in den Streichern, oder mit einem beliebigen anderen Separator

In [50]: df.words.str.join('|').str.get_dummies('|').astype(bool) 
Out[50]: 
     a  b  c  d 
0 True True False False 
1 True False True True 

Für Einzelwert.

In [68]: df['a'] = df.words.apply(lambda x: 'a' in x) # or ['a' in x for x in df.words] 
+0

Dank. Es ist eine nette Antwort. Übrigens hat mein Datenframe ungefähr 100 Millionen Zeilen, und es gibt ungefähr 2000 verschiedene Wörter. Dies ist immer noch sehr langsam und leidet möglicherweise unter einem Speicherfehler. Wie kann ich die Spalte für nur ein Wort wie "a" generieren? – Hossein

+0

Die Lösung wurde aktualisiert. Und für diese großen Daten ist das Speichern von Listen in einer Spalte sehr ineffizient. – Zero

+0

Es scheint, 'df.words.apply' ist nicht effizienter als das, was ich in der Frage erwähnte (und Sie als Kommentar hinzugefügt). Über das Speichern von Listen in einer Spalte gibt es einen alternativen Weg? – Hossein

Verwandte Themen