Angenommen, ich habe einen Datenrahmen mit Ländern, der wie folgt lautet:
cc | temp
US | 37.0
CA | 12.0
US | 35.0
AU | 20.0
Ich weiß, dass es eine pd.get_dummies-Funktion gibt, mit der die Länder in "One-Hot-Codierungen" konvertiert werden können. Ich möchte sie jedoch stattdessen in Indizes umwandeln, sodass ich sie cc_index = [1,2,1,3]
stattdessen erhalte .
Ich gehe davon aus, dass es einen schnelleren Weg gibt als die Verwendung von get_dummies zusammen mit einer numpy where-Klausel, wie unten gezeigt:
[np.where(x) for x in df.cc.get_dummies().values]
Dies ist in R mit 'Faktoren' etwas einfacher, also hoffe ich, dass Pandas etwas Ähnliches haben.
cc_index = [0,1,0,2]
?Antworten:
Ändern Sie zunächst den Typ der Spalte:
Jetzt sehen die Daten ähnlich aus, werden aber kategorisch gespeichert. So erfassen Sie die Kategoriecodes:
df['code'] = df.cc.cat.codes
Jetzt hast du:
cc temp code 0 US 37.0 2 1 CA 12.0 1 2 US 35.0 2 3 AU 20.0 0
Wenn Sie Ihren DataFrame nicht ändern möchten, sondern einfach die Codes erhalten möchten:
df.cc.astype('category').cat.codes
Oder verwenden Sie die kategoriale Spalte als Index:
quelle
df.cc.cat.codes
scheint sich auf gerade geändert zu habendf.cc.codes
?Wenn Sie Ihre Serie nur in ganzzahlige Bezeichner umwandeln möchten, können Sie verwenden
pd.factorize
.Beachten Sie, dass diese Lösung im Gegensatz
pd.Categorical
dazu nicht alphabetisch sortiert wird. So wird das erste Land zugewiesen0
. Wenn Sie beginnen möchten1
, können Sie eine Konstante hinzufügen:df['code'] = pd.factorize(df['cc'])[0] + 1 print(df) cc temp code 0 US 37.0 1 1 CA 12.0 2 2 US 35.0 1 3 AU 20.0 3
Wenn Sie alphabetisch sortieren möchten, geben Sie Folgendes an
sort=True
:df['code'] = pd.factorize(df['cc'], sort=True)[0] + 1
quelle
Wenn Sie die
sklearn
Bibliothek verwenden, können Sie verwendenLabelEncoder
. Ebensopd.Categorical
werden Eingabezeichenfolgen vor dem Codieren alphabetisch sortiert.from sklearn.preprocessing import LabelEncoder LE = LabelEncoder() df['code'] = LE.fit_transform(df['cc']) print(df) cc temp code 0 US 37.0 2 1 CA 12.0 1 2 US 35.0 2 3 AU 20.0 0
quelle
Versuchen Sie dies, konvertieren Sie in eine Zahl basierend auf der Frequenz (Hochfrequenz - hohe Zahl):
labels = df[col].value_counts(ascending=True).index.tolist() codes = range(1,len(labels)+1) df[col].replace(labels,codes,inplace=True)
quelle
Ändert alle Spalten in Zahlen. Es wird keine neue Spalte erstellt, sondern nur die Werte durch numerische Daten ersetzt.
def characters_to_numb(*args): for arg in args: df[arg] = pd.Categorical(df[arg]) df[arg] = df[arg].cat.codes return df
quelle
Einzeiliger Code:
df[['cc']] = df[['cc']].apply(lambda col:pd.Categorical(col).codes)
Dies funktioniert auch, wenn Sie eine
list_of_columns
:df[list_of_columns] = df[list_of_columns].apply(lambda col:pd.Categorical(col).codes)
Wenn Sie Ihre
NaN
Werte beibehalten möchten, können Sie außerdem Folgendes ersetzen:df[['cc']] = df[['cc']].apply(lambda col:pd.Categorical(col).codes).replace(-1,np.nan)
quelle