Die Umkehrung ("one-hot" - Codierung in Pandas
Problem statement
Ich will von dieser Daten-Rahmen, die im Grunde ist ein hot kodiert.
In [2]: pd.DataFrame({"monkey":[0,1,0],"rabbit":[1,0,0],"fox":[0,0,1]})
Out[2]:
fox monkey rabbit
0 0 0 1
1 0 1 0
2 1 0 0
3 0 0 0
4 0 0 0
Zu diesem einen, ist 'reverse' one-hot kodiert.
In [3]: pd.DataFrame({"animal":["monkey","rabbit","fox"]})
Out[3]:
animal
0 monkey
1 rabbit
2 fox
Ich kann mir vorstellen, es gibt eine Art von kluger Nutzung gelten oder zip zu tun lichtet, aber ich bin mir nicht sicher, wie... Kann jemand helfen?
Habe ich nicht viel Erfolg hatte mit der Indizierung usw, um zu versuchen, dieses problem zu lösen.
- Zeig uns deinen code bitte.
- Ihre 2 dataframes nicht übereinstimmen...
- Ich behoben - vielen Dank für das beobachten 🙂
- könnte Sie nach Ihrem gewünschten DF für diesen Eingang DF:
pd.DataFrame({'dog': {0: 0, 1: 0, 2: 0, 3: 0, 4: 0, 5: 1}, 'fox': {0: 0, 1: 0, 2: 1, 3: 0, 4: 0, 5: 0}, 'monkey': {0: 0, 1: 1, 2: 0, 3: 0, 4: 0, 5: 0}, 'rabbit': {0: 1, 1: 0, 2: 0, 3: 0, 4: 0, 5: 0}})
, weil jetzt ich verstehe nicht, Ihre gewünschten DF? - könnten Sie bitte klären, ob Ihre Eingabedaten kann mit mehr als einer
1
in einer Spalte? Und wie hast du die Zeilen, die nur Nullen? - stackoverflow.com/a/55757342/2384397
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich würde verwenden, gelten die zum decodieren der Spalten:
UPDATE: ich denke ayhan ist richtig und soll es sein:
Demo:
ALTE Antwort: (wahrscheinlich falsche Antwort)
versuchen Sie dies:
Daten:
df.idxmax(axis=1)
?pd.DataFrame({'dog': {0: 0, 1: 0, 2: 0, 3: 0, 4: 0, 5: 1}, 'fox': {0: 0, 1: 0, 2: 1, 3: 0, 4: 0, 5: 0}, 'monkey': {0: 0, 1: 1, 2: 0, 3: 0, 4: 0, 5: 0}, 'rabbit': {0: 1, 1: 0, 2: 0, 3: 0, 4: 0, 5: 0}})
one-hot encoding
richtig, es könnte nur ein1
(eins) pro Spalte und die OP ' s wollen wissen, dass Ihre Indizes...pd.Series(['dog', 'cat', 'dog', 'bird']).str.get_dummies()
. get_dummies produziert immer eine Struktur wie diese (nie mehr als eine 1 in eine Zeile). OP ' s Frage ist problematisch. Sie wollen das original-array, das verwendet wurde, erstellen dummies, aber die Reihenfolge, in der das Beispiel ist falsch (es sollte Hase, Affe, Fuchs). Andere als die, wie ich sagte, es ist eine gängige Praxis, um drop eine der Spalten, die beim erstellen von dummies (um zu vermeiden, multicollinearity) aber um wieder zurück auf das original-array müssen wir wissen, was die Spalte war.one-hot encoding
war, die meisten wahrscheinlich, falsch - danke für das Beispiel...pd.DataFrame({'dog': {0: 0, 1: 0, 2: 0, 3: 0, 4: 0, 5: 1}, 'fox': {0: 0, 1: 0, 2: 1, 3: 0, 4: 0, 5: 0}, 'monkey': {0: 0, 1: 1, 2: 0, 3: 0, 4: 0, 5: 0}, 'rabbit': {0: 1, 1: 0, 2: 0, 3: 0, 4: 0, 5: 0}}).idxmax(1)
- gibt IMO unerwartete Ergebnisse...df.sum(axis=1).map({0: 'That animal'}).fillna(df.idxmax(axis=1))
one-hot encoding
richtig...Ich tun würde:
Timing
MaxU ' s Methode hat Rand für große dataframes
Kleine
df
5 x 3Großen
df
1000000 x 52Versuchen Sie dies:
Dies funktioniert sowohl mit einzelnen und mehreren Etiketten.
Wir können verwenden Sie die erweiterte Indizierung, um dieses problem anzugehen. Hier ist der link.
Und das Ergebnis ist:
Erklärung:
Wir Durchlaufen die Spalten auf der dataframe.
Die Zeile oben im Grunde findet Sie alle Orte, an denen df[col_name] == 1, wählt in der Spalte 'tags' und legen Sie es auf der RHS-Wert, df['tags']+' '+ col_name
Hinweis:
.ix
wurde als veraltet markiert, da Pandas v0.20. Sollten Sie stattdessen.loc
oder.iloc
als angemessen.