Ich habe einen Pandas-Datenrahmen (X11) wie folgt: Tatsächlich habe ich 99 Spalten bis zu dx99
dx1 dx2 dx3 dx4
0 25041 40391 5856 0
1 25041 40391 25081 5856
2 25041 40391 42822 0
3 25061 40391 0 0
4 25041 40391 0 5856
5 40391 25002 5856 3569
Ich möchte zusätzliche Spalten für Zellenwerte wie 25041,40391,5856 usw. erstellen. Es wird also eine Spalte 25041 mit dem Wert 1 oder 0 geben, wenn 25041 in dieser bestimmten Zeile in einer beliebigen dxs-Spalte vorkommt. Ich verwende diesen Code und er funktioniert, wenn die Anzahl der Zeilen geringer ist.
mat = X11.as_matrix(columns=None)
values, counts = np.unique(mat.astype(str), return_counts=True)
for x in values:
X11[x] = X11.isin([x]).any(1).astype(int)
Ich bekomme folgendes Ergebnis:
dx1 dx2 dx3 dx4 0 25002 25041 25061 25081 3569 40391 42822 5856
25041 40391 5856 0 0 0 1 0 0 0 1 0 1
25041 40391 25081 5856 0 0 1 0 1 0 1 0 1
25041 40391 42822 0 0 0 1 0 0 0 1 1 0
25061 40391 0 0 0 0 0 1 0 0 1 0 0
25041 40391 0 5856 0 0 1 0 0 0 1 0 1
40391 25002 5856 3569 0 1 0 0 0 1 1 0 1
Wenn die Anzahl der Zeilen viele Tausend oder in Millionen beträgt, hängt es und dauert ewig, und ich erhalte kein Ergebnis. Bitte beachten Sie, dass die Zellenwerte nicht nur für Spalten gelten, sondern sich in mehreren Spalten wiederholen. Zum Beispiel kommt 40391 sowohl in dx1 als auch in dx2 usw. für 0 und 5856 usw. vor. Haben Sie eine Idee, wie Sie die oben erwähnte Logik verbessern können?
quelle
Antworten:
Es gibt eine viel pythonischere Lösung in Pandas ...
Bei 10 Millionen Zeilen auf meinem Laptop dauert dies weniger als eine Sekunde:
Hier sind die Details aufgeführt:
Einfacher kleiner Datenrahmen -
Binarisierungsmethode -
Datenrahmen mit 10 Millionen Zeilen -
Zeitgesteuerte Binärisierung (auch bekannt als One-Hot-Codierung) für 10 Millionen Zeilendatenrahmen -
Hoffe das hilft!
quelle
Es sieht so aus, als ob Sie eine Dummy-Variable aus einer Pandas-Datenrahmenspalte erstellen möchten. Glücklicherweise hat Pandas eine spezielle Methode dafür :
get_dummies()
. Hier ist ein Code-Snippet, das Sie an Ihre Bedürfnisse anpassen können:Hier ist die Ausgabe von
data_transformed
:quelle