So konvertieren Sie kategoriale Daten in Pyspark in numerische Daten


11

Ich verwende Ipython Notebook, um mit Pyspark-Anwendungen zu arbeiten. Ich habe eine CSV-Datei mit vielen kategorialen Spalten, um festzustellen, ob das Einkommen unter oder über dem Bereich von 50.000 liegt. Ich möchte einen Klassifizierungsalgorithmus durchführen, der alle Eingaben verwendet, um den Einkommensbereich zu bestimmen. Ich muss ein Wörterbuch mit Variablen für zugeordnete Variablen erstellen und eine Zuordnungsfunktion verwenden, um die Variablen Zahlen für die Verarbeitung zuzuordnen. Im Wesentlichen würde mein Datensatz in einem numerischen Format vorliegen, damit ich an der Implementierung der Modelle arbeiten kann.

Im Datensatz gibt es kategoriale Spalten wie Bildung, Familienstand, Arbeiterklasse usw. Kann mir jemand sagen, wie man sie in pyspark in numerische Spalten umwandelt?

workclass = {'?':0,'Federal-gov':1,'Local-gov':2,'Never-  worked':3,'Private':4,'Self-emp-inc':5,'Self-emp-not-inc':6,'State-gov':7,'Without-pay':8}

Ich habe ein Beispielwörterbuch mit Schlüsselwertpaaren für die Arbeiterklasse erstellt. Ich weiß jedoch nicht, wie ich dies in einer Kartenfunktion verwenden und die kategorialen Daten in der CSV-Datei durch den entsprechenden Wert ersetzen soll.

wc = pd.read_csv('PATH', usecols = ['Workclass'])

df = pd.DataFrame(wc)
wcdict = {' ?':0,' Federal-gov':1,' Local-gov':2,' Never-worked':3,' Private':4,' Self-emp-inc':5,' Self-emp-n-inc':6,' State-gov':7,' Without-pay':8}
df_new = df.applymap(lambda s: wcdict.get(s) if s in wcdict else s)
print(df_new)

Dies ist der Code, den ich in normalem Python geschrieben habe, um die kategorialen Daten in numerische Daten umzuwandeln. Es funktioniert gut. Ich möchte die Konvertierung im Funkenkontext durchführen. Die Datenquelle enthält 9 kategoriale Spalten. Gibt es eine Möglichkeit, den Wörterbuchaktualisierungsprozess zu automatisieren, um ein KV-Paar für alle 9 Spalten zu erhalten?

Antworten:


14

Dies kann StringIndexerin PySpark erfolgen und umgekehrt IndexToStringals Referenz. Bitte überprüfen Sie Folgendes :

from pyspark.ml.feature import StringIndexer

df = sqlContext.createDataFrame(
    [(0, "a"), (1, "b"), (2, "c"), (3, "a"), (4, "a"), (5, "c")],
    ["id", "category"])
indexer = StringIndexer(inputCol="category", outputCol="categoryIndex")
indexed = indexer.fit(df).transform(df)
indexed.show()

Weitere Informationen finden Sie in der Funken-Dokumentation


2
workclass = {'?':0,'Federal-gov':1,'Local-gov':2,'Never-  worked':3,'Private':4,'Self-emp-inc':5,'Self-emp-not-inc':6,'State-gov':7,'Without-pay':8}

Versuchen Sie, eine Mapper-Funktion zu definieren, die den Schlüssel zurückgibt:

def mapr(dict_key):
    return workclass[dict_key]

print list(map(mapr,workclass))

Hey, kannst du mir bitte erklären, was dieser Block macht? Ich habe mein Skript mit diesem hinzugefügten Code ausgeführt und [6, 1, 4, 3, 5, 7, 8, 0, 2] als Ausgabe erhalten. Ich möchte den Inhalt der Arbeitsklasse mithilfe der Werte im Wörterbuch durch numerische Werte ersetzen.
SRS

Hallo, Die mapr-Funktion gibt einen numerischen Wert zurück, der dem Kategoriewert zugeordnet ist. Beispiel: 6 für 'Self-emp-not-inc' sind Python-Wörterbücher ungeordnet. Wenn Sie ein geordnetes Wörterbuch wünschen, versuchen Sie es mit collection.OrderedDict.
Sreejithc321

Okay, jetzt verstehe ich die Funktion. Die Sache ist, ich habe eine CSV mit mehreren tausend Zeilen und es gibt eine Spalte namens Workclass, die einen der im Wörterbuch genannten Werte enthält. Daher muss ich für jede Zeile den Text in dieser Spalte in eine Zahl ändern, indem ich den Text mit dem Wörterbuch vergleiche und die entsprechende Zahl ersetze. Wie verwende ich eine Funktion, um die Spalte nach Zeilen zu analysieren und die Werte mit dem Wörterbuch zu vergleichen?
SRS

Sie können eine zusätzliche Spalte erstellen, z. B. 'workclass_num', in der numerische Werte gespeichert werden, die dem kategorialen Wert entsprechen. Überprüfen Sie die Python Pandas-Bibliothek.
Sreejithc321
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.