Come convertire i dati categorici in dati numerici in Pyspark


11

Sto usando il notebook Ipython per lavorare con le applicazioni pyspark. Ho un file CSV con molte colonne categoriche per determinare se il reddito rientra o supera l'intervallo 50k. Vorrei eseguire un algoritmo di classificazione prendendo tutti gli input per determinare l'intervallo di reddito. Ho bisogno di costruire un dizionario di variabili su variabili mappate e utilizzare una funzione di mappatura per mappare le variabili in numeri per l'elaborazione. In sostanza, vorrei che il mio set di dati fosse in un formato numerico in modo da poter lavorare sull'implementazione dei modelli.

Nel set di dati, ci sono colonne categoriche come istruzione, stato civile, classe lavoratrice ecc. Qualcuno può dirmi come convertirle in colonne numeriche in pyspark?

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}

Ho creato un dizionario di esempio con coppie chiave-valore per la classe di lavoro. Ma non so come usarlo in una funzione di mappa e sostituire i dati categorici nel file CSV con il valore corrispondente.

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)

Questo è il codice che ho scritto in Python normale per convertire i dati categorici in dati numerici. Funziona bene Voglio fare la conversione in un contesto spark. E ci sono 9 colonne categoriche nell'origine dati. C'è un modo per automatizzare il processo di aggiornamento del dizionario per avere una coppia KV per tutte e 9 le colonne?

Risposte:


14

Questo può essere fatto usando StringIndexerin PySpark e viceversa usando IndexToStringcome riferimento si prega di controllare questo:

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()

Per ulteriori dettagli, consultare la documentazione di Spark


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}

prova a definire una funzione mapper che restituisce chiave:

def mapr(dict_key):
    return workclass[dict_key]

print list(map(mapr,workclass))

Ehi, potresti spiegarmi cosa fa questo blocco? Ho eseguito il mio script con questo codice aggiunto e ho ottenuto [6, 1, 4, 3, 5, 7, 8, 0, 2] come output. Voglio sostituire i valori numerici al contenuto della classe di lavoro usando i valori nel dizionario.
SRS,

Ciao, La funzione mapr restituirà un valore numerico associato al valore della categoria. ad es .: 6 per "Self-emp-not-inc", i dizionari Python non sono ordinati. Se vuoi un dizionario ordinato, prova collezioni.OrderedDict.
Sreejithc321,

Bene, ora capisco la funzione. Il fatto è che ho un CSV con diverse migliaia di righe e c'è una colonna chiamata Workclass che contiene uno dei valori menzionati nel dizionario. Quindi, per ogni riga, devo cambiare il testo in quella colonna in un numero confrontando il testo con il dizionario e sostituendo il numero corrispondente. Come si usa una funzione per analizzare la colonna per righe e confrontare i valori con il dizionario?
SRS,

È possibile creare una colonna aggiuntiva, ad esempio "workclass_num" che memorizza i valori numerici corrispondenti al valore categoriale. Controlla la libreria Python Pandas.
Sreejithc321,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.