2

In einem Pandas DataFrame, wie kann eine Spalte, die ein kategorisches Merkmal darstellt (z. B. ob der Tag ein Arbeitstag oder ein Wochenende ist) in einer numerischen Ordnungszahlform (z. B. 1 für Arbeitstag, 2 für Wochenende) so umgewandelt werden es stellt die Werte kategorisch dar, etwa wie (0, 1) für Arbeitstage und (1, 0) für Wochenenden, so dass die Werte nicht vergleichbar sind?Wie werden Ordinalwerte in kategorische umgewandelt?

Es gibt die Alternative pd.get_dummies (oder die OneHotEncoder), die zwei Spalten mit 0s und 1s erstellen würde, und dann die beiden Spalten in Tupeln zusammenführen, aber gibt es nicht direkte Möglichkeit, das zu tun?

Beispiel: ich habe:

datetime temp daytype 
0 2011-01-01 9.84 2 
1 2011-01-02 9.02 2 
2 2011-01-03 9.02 1 
3 2011-01-04 9.84 1 
4 2011-01-05 9.84 1 
5 2011-01-06 9.84 1 

Ich mag:

datetime temp daytype 
0 2011-01-01 9.84 (1, 0) 
1 2011-01-02 9.02 (1, 0) 
2 2011-01-03 9.02 (0, 1) 
3 2011-01-04 9.84 (0, 1) 
4 2011-01-05 9.84 (0, 1) 
5 2011-01-06 9.84 (0, 1) 

(Ich fange vielleicht zu denken, dass ich bin immer es falsch - ist dies nicht die Standardmethode der Darstellung von kategorischen Werten?)

+1

Haben Sie die [Dokumentation zu kategorischen Daten] gesehen? (Http://pandas.pydata.org/pandas-docs/stable/categorical.html) ? – languitar

+1

Ich denke du brauchst 'df ['daytype'] = df ['daytype']. Astype ('category')' – jezrael

+0

Ja, der astype oder dtype wird auch aus der Dokumentation empfohlen. Ich glaube, dass ich (fälschlicherweise) nach einer Möglichkeit suchte, um zu visualisieren, dass die Werte nicht vergleichbar sind. – Ioanna

Antwort

1

Sie können Ihre Attrappen/one-hot-Vektor erstellen und diese dann in ein Tupel kombinieren:

Ihre ursprünglichen Daten ungefähr so ​​aussieht

import pandas as pd 
df = pd.DataFrame({"daytype": [2, 2, 1, 1, 1, 2]}) 
print(df) 

    daytype 
0  2 
1  2 
2  1 
3  1 
4  1 
5  2 

Wir Dummy-Variablen erstellen können, die, wie Sie richtig darauf hingewiesen, in separaten Spalten führen:

dummies = pd.get_dummies(df["daytype"]).astype(int) 
print(dummies) 

    1 2 
0 0 1 
1 0 1 
2 1 0 
3 1 0 
4 1 0 
5 0 1 

Aber dann können Sie diese separaten Spalten und zip sie zusammen und weisen das Ergebnis wieder als eine Spalte in Ihrer ursprünglichen nehmen:

df["combined"] = list(zip(dummies[1], dummies[2])) 

Geben Sie:

print(df) 

    daytype combined 
0  2 (0, 1) 
1  2 (0, 1) 
2  1 (1, 0) 
3  1 (1, 0) 
4  1 (1, 0) 
5  2 (0, 1) 

Natürlich können Sie ganz die ursprüngliche Spalte mit der kombinierten ersetzen, wenn Sie wollen, ich trennte sie nur für Klarheit

Die oben geben Ihnen die gewünschten Ergebnisse, die Sie Posted in der ursprünglichen Frage, aber Sie können auch direkt den Typ der spezifischen Spalte wie in den Kommentaren erwähnt:

Letztendlich kommt es darauf an, was Sie mit der Spalte tun möchten

+0

Ja, die get_dummies + merge würde mir geben, was ich wollte, aber ich frage mich, ob es einen Encoder gibt, der das direkt macht: D. Vielen Dank. – Ioanna

+0

Ich könnte mich irren, aber ich denke nicht, dass Theres ein Built-in ist, der dir das direkt geben wird, da ich nicht an eine Situation denke, in der das Darstellen einer Kategorie auf diese Weise nützlich wäre. Was planen Sie mit der neuen kombinierten Säule? – Simon

+0

Ich plante eine lineare Regression auf dem transformierten Datenrahmen. – Ioanna

2

Hier ist ein Weg, es zu tun: df['daytype'] = df['daytype'].apply(lambda x : (1, 0) if x == 2 else (0,1))

Verwandte Themen