Как преобразовать категориальные данные в числовые данные в Pyspark


11

Я использую ноутбук Ipython для работы с приложениями pyspark. У меня есть файл CSV с множеством категориальных столбцов, чтобы определить, находится ли доход ниже или выше диапазона 50 КБ. Я хотел бы выполнить алгоритм классификации, используя все входные данные для определения диапазона доходов. Мне нужно создать словарь переменных для сопоставленных переменных и использовать функцию map для отображения переменных в числа для обработки. По сути, я хотел бы, чтобы мой набор данных был в числовом формате, чтобы я мог работать над реализацией моделей.

В наборе данных есть такие категориальные столбцы, как образование, семейное положение, рабочий класс и т. Д. Может кто-нибудь сказать мне, как преобразовать их в числовые столбцы в 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}

Я создал пример словаря с парами ключ-значение для рабочего класса. Но я не знаю, как использовать это в функции карты и заменить категориальные данные в CSV-файле соответствующим значением.

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)

Это код, который я написал в обычном Python для преобразования категориальных данных в числовые данные. Работает нормально. Я хочу сделать преобразование в контексте искры. И есть 9 категориальных столбцов в источнике данных. Есть ли способ автоматизировать процесс обновления словаря, чтобы иметь пару KV для всех 9 столбцов?

Ответы:


14

Это можно сделать с помощью StringIndexerPySpark и наоборот IndexToStringдля справки, пожалуйста, проверьте это:

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

Для более подробной информации, пожалуйста, проверьте документацию искры


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}

попробуйте определить маппер, который возвращает ключ:

def mapr(dict_key):
    return workclass[dict_key]

print list(map(mapr,workclass))

Эй, не могли бы вы объяснить мне, что делает этот блок? Я запустил свой скрипт с добавленным кодом и получил [6, 1, 4, 3, 5, 7, 8, 0, 2] в качестве вывода. Я хочу подставить числовые значения в содержание рабочего класса, используя значения в словаре.
SRS

Привет, функция mapr вернет числовое значение, связанное со значением категории. Например: 6 для «Self-emp-not-inc», словари Python неупорядочены. Если вы хотите заказать словарь, попробуйте collection.OrderedDict.
Sreejithc321

Хорошо, теперь я понимаю функцию. Дело в том, что у меня есть CSV с несколькими тысячами строк, и есть столбец с именем Workclass, который содержит любое из значений, упомянутых в словаре. Поэтому для каждой строки мне нужно изменить текст в этом столбце на число, сравнив текст со словарем и подставив соответствующее число. Как использовать функцию для анализа столбца по строкам и сравнения значений со словарем?
SRS

Вы можете создать дополнительный столбец, скажем 'workclass_num', в котором хранятся числовые значения, соответствующие категориальному значению. Проверьте библиотеку Python Pandas.
Sreejithc321
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.