Cómo convertir datos categóricos a datos numéricos en Pyspark

11

Estoy usando el cuaderno Ipython para trabajar con aplicaciones pyspark. Tengo un archivo CSV con muchas columnas categóricas para determinar si el ingreso cae por debajo o por encima del rango de 50k. Me gustaría realizar un algoritmo de clasificación tomando todas las entradas para determinar el rango de ingresos. Necesito construir un diccionario de variables a variables mapeadas y usar una función de mapeo para mapear las variables a números para su procesamiento. Esencialmente, quisiera que mi conjunto de datos esté en un formato numérico para poder trabajar en la implementación de los modelos.

En el conjunto de datos, hay columnas categóricas como educación, estado civil, clase trabajadora, etc. ¿Alguien puede decirme cómo convertirlas en columnas numéricas en 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}

Creé un diccionario de muestra con pares de valores clave para la clase de trabajo. Pero, no sé cómo usar esto en una función de mapa y reemplazar los datos categóricos en el archivo CSV con el valor correspondiente.

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)

Este es el código que he escrito en Python normal para convertir los datos categóricos en datos numéricos. Funciona bien. Quiero hacer la conversión en contexto de chispa. Y, hay 9 columnas categóricas en la fuente de datos. ¿Hay alguna manera de automatizar el proceso de actualización del diccionario para tener un par KV para las 9 columnas?

SRS
fuente

Respuestas:

14

Esto se puede hacer usando StringIndexerPySpark y el reverso usando IndexToStringcomo referencia, verifique esto:

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

Para más detalles, consulte la documentación de chispa

Krishna Prasad
fuente
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}

intente definir una función de mapeador que regrese la clave:

def mapr(dict_key):
    return workclass[dict_key]

print list(map(mapr,workclass))
Sreejithc321
fuente
Oye, ¿podrías explicarme qué hace este bloque? Ejecuté mi script con este código agregado y obtuve [6, 1, 4, 3, 5, 7, 8, 0, 2] como salida. Quiero sustituir valores numéricos al contenido de la clase de trabajo utilizando los valores del diccionario.
SRS
Hola, la función mapr devolverá el valor numérico asociado con el valor de la categoría. por ejemplo: 6 para 'Self-emp-not-inc', los diccionarios de python no están ordenados. Si desea un diccionario ordenado, intente colecciones.OrderedDict.
Sreejithc321
Bien, ahora entiendo la función. La cosa es que tengo un CSV con varios miles de filas y hay una columna llamada Workclass que contiene cualquiera de los valores mencionados en el diccionario. Entonces, para cada fila, necesito cambiar el texto en esa columna a un número comparando el texto con el diccionario y sustituir el número correspondiente. ¿Cómo uso una función para analizar la columna por filas y comparar los valores con el diccionario?
SRS
Puede crear una columna adicional, digamos 'workclass_num', que almacena valores numéricos correspondientes al valor categórico. Verifique la biblioteca Python Pandas.
Sreejithc321