Comment convertir des données catégorielles en données numériques dans Pyspark


11

J'utilise le bloc-notes Ipython pour travailler avec des applications pyspark. J'ai un fichier CSV avec beaucoup de colonnes catégorielles pour déterminer si le revenu tombe sous ou au-dessus de la plage 50k. Je voudrais effectuer un algorithme de classification prenant toutes les entrées pour déterminer la plage de revenu. J'ai besoin de construire un dictionnaire de variables pour les variables mappées et d'utiliser une fonction de carte pour mapper les variables aux nombres pour le traitement. Essentiellement, je voudrais que mon ensemble de données soit dans un format numérique afin que je puisse travailler sur la mise en œuvre des modèles.

Dans l'ensemble de données, il y a des colonnes catégorielles comme l'éducation, l'état matrimonial, la classe ouvrière, etc. Quelqu'un peut-il me dire comment les convertir en colonnes numériques dans 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}

J'ai créé un exemple de dictionnaire avec des paires de valeurs clés pour la classe de travail. Mais, je ne sais pas comment utiliser cela dans une fonction de carte et remplacer les données catégorielles dans le fichier CSV par la valeur correspondante.

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)

C'est le code que j'ai écrit en python normal pour convertir les données catégorielles en données numériques. Ça fonctionne bien. Je veux faire la conversion dans un contexte spark. Et, il y a 9 colonnes catégorielles dans la source de données. Existe-t-il un moyen d'automatiser le processus de mise à jour du dictionnaire pour avoir une paire KV pour les 9 colonnes?

Réponses:


14

Cela peut être fait en utilisant StringIndexerdans PySpark et l'inverse en utilisant IndexToStringpour référence, veuillez vérifier ceci:

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

Pour plus de détails, veuillez consulter la documentation 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}

essayez de définir une fonction de mappeur qui retourne la clé:

def mapr(dict_key):
    return workclass[dict_key]

print list(map(mapr,workclass))

Hé, pourriez-vous m'expliquer ce que fait ce bloc? J'ai exécuté mon script avec ce code ajouté et j'ai obtenu [6, 1, 4, 3, 5, 7, 8, 0, 2] en sortie. Je veux substituer des valeurs numériques au contenu de la classe de travail en utilisant les valeurs du dictionnaire.
SRS

Salut, La fonction mapr renverra la valeur numérique associée à la valeur de catégorie. par exemple: 6 pour 'Self-emp-not-inc', les dictionnaires python ne sont pas ordonnés. Si vous voulez un dictionnaire ordonné, essayez collections.OrderedDict.
Sreejithc321

D'accord, maintenant je comprends la fonction. Le fait est que j'ai un CSV avec plusieurs milliers de lignes et il y a une colonne nommée Workclass qui contient l'une des valeurs mentionnées dans le dictionnaire. Donc, pour chaque ligne, je dois changer le texte de cette colonne en un nombre en comparant le texte avec le dictionnaire et remplacer le numéro correspondant. Comment utiliser une fonction pour analyser la colonne par lignes et comparer les valeurs avec le dictionnaire?
SRS

Vous pouvez créer une colonne supplémentaire, par exemple «workclass_num», qui stocke des valeurs numériques correspondant à la valeur catégorielle. Vérifiez la bibliothèque Python Pandas.
Sreejithc321
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.