Haben Sie eine Pandas-Spalte, die Listen enthält und wie Sie eindeutige Listenelemente in Spalten umlenken können?

8

Ich habe einen Web-Scraper geschrieben, um Informationen aus einer Produkttabelle zu ziehen und einen Datenrahmen zu erstellen. Die Datentabelle hat eine Beschreibungsspalte, die eine durch Kommas getrennte Zeichenfolge von Attributen enthält, die das Produkt beschreiben. Ich möchte für jedes eindeutige Attribut eine Spalte im Datenrahmen erstellen und die Zeile in dieser Spalte mit der Teilzeichenfolge des Attributs füllen. Beispiel df unten.

%Vor%

Ich denke, der erste Schritt besteht darin, die Beschreibung in eine Liste aufzuteilen.

%Vor%

Meine gewünschte Ausgabe sieht wie die folgende Tabelle aus. Die Spaltennamen sind nicht besonders wichtig.

%Vor%

Ich glaube, dass die Spalten mit einem Pivot eingerichtet werden können, aber ich bin mir nicht sicher, ob die Spalten nach dem Einrichten pythonisch sind. Jede Hilfe wird geschätzt.

AKTUALISIEREN

Vielen Dank für die Antworten. Ich habe @ MaxUs Antwort als richtig gewählt, da sie etwas flexibler erscheint, aber @ piRSquared's bekommt ein sehr ähnliches Ergebnis und könnte sogar als pythonischer Ansatz betrachtet werden. Ich habe beide Versionen getestet und beide tun, was ich brauche. Danke!

    
C. Hale 12.09.2016, 21:50
quelle

5 Antworten

5

Sie können eine dünn besetzte Matrix aufbauen:

%Vor%     
MaxU 12.09.2016, 22:41
quelle
5

Verwenden Sie pd.get_dummies

%Vor%

    
piRSquared 12.09.2016 23:09
quelle
1

Hier ist meine Antwort auf eine Lösung, die von einem Problem, an dem ich bereits gearbeitet habe, erweitert wurde.

%Vor%

Ich habe auch @ MaxUs, @ piRSquared's und meine Lösungen auf einem Pandas-Datenrahmen mit 11592 Zeilen und einer Spalte mit Listen mit 2681 eindeutigen Werten getestet. Offensichtlich sind die Spaltennamen im Testdatenrahmen unterschiedlich, aber ich habe dieselben wie in der Frage beibehalten.

Hier sind die Benchmarks für jede Methode

%Vor%

1 Schleife, am besten 3: 1,14 s pro Schleife

%Vor%

1 Schleife, beste von 3: 612 ms pro Schleife

%Vor%

1 Schleife, Best of 3: 62,7 ms pro Schleife

Meine Vermutung ist, dass Aggregation und Entstapeln schneller ist als pivot_table () oder pd.get_dummies ().

    
Keith Landry 24.10.2017 00:54
quelle
0

Wie wäre es mit etwas, das ein 'X' in der Feature-Spalte platziert, wenn das Produkt diese Funktion hat.

Im Folgenden wird eine Liste eindeutiger Funktionen ("Stahl", "Rot" usw.) erstellt und anschließend eine Spalte für jedes Feature im Original-DF erstellt. Dann durchlaufen wir jede Zeile und fügen für jedes Produktmerkmal ein 'X' in die Zelle ein.

%Vor%

wurde mit der Beispielausgabe aktualisiert:

%Vor%     
NickBraunagel 12.09.2016 22:35
quelle
0

Die Antworten von @piRSquared und @MaxU funktionieren sehr gut.

Aber nur, wenn die Daten keine NaN -Werte haben. Daten, mit denen ich arbeitete, waren sehr spärlich. Es hatte ungefähr 1M Zeilen, die nach Anwendung der obigen Methode auf nur einige 100 Zeilen reduziert wurden, da alle Zeilen mit NaN s in einer der Spalten gelöscht wurden. Ich brauchte mehr als einen Tag, um die Korrekturen herauszufinden. Teilen des leicht modifizierten Codes, um Zeit für andere zu sparen.

Angenommen, Sie haben df DataFrame wie oben erwähnt,

  • Ersetze alle NaN -Erscheinungen zuerst durch etwas, das in keiner der anderen Spalten erwartet wird, da du es später wieder in NaN ersetzen musst.

    %Vor%

    Dies wird benötigt, da groupby alle Zeilen mit NaN-Werten löscht. : /

  • Dann führen wir aus, was in anderen Antworten vorgeschlagen wird, mit einer kleinen Änderung stack(dropna=False) . Standardmäßig ist dropna=True .

    %Vor%
  • Und dann setzen Sie NaN in df zurück, um die Daten anderer Spalten nicht zu verändern.

    %Vor%

Hoffe das spart Stunden Frustration für jemanden.

    
PratPor 07.09.2017 13:20
quelle

Tags und Links