Як конвертувати категоричні дані в числові дані в Pyspark


11

Я використовую ноутбук Ipython для роботи з програмами pyspark. У мене є файл CSV з великою кількістю категоричних стовпців, щоб визначити, чи потрапляє дохід під діапазон 50k або більше. Я хотів би виконати алгоритм класифікації, беручи всі вхідні дані для визначення діапазону доходів. Мені потрібно побудувати словник змінних до відображених змінних і використовувати функцію 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)

Це код, який я написав у звичайному пітоні для перетворення категоричних даних у числові дані. Це чудово працює. Я хочу зробити перетворення в іскровому контексті. І в джерелі даних є 9 категоричних стовпців. Чи є спосіб автоматизувати процес оновлення словника, щоб мати пару KV для всіх 9 стовпців?

Відповіді:


14

Це можна зробити, використовуючи StringIndexerв PySpark, а зворотний, використовуючи 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

Привіт, функція Mapp поверне числове значення, пов'язане зі значенням категорії. наприклад: 6 для "Self-emp-not-inc", словники python мають не упорядкований характер. Якщо ви хочете замовити словник, спробуйте колекції.OrderedDict.
Sreejithc321

Гаразд, тепер я розумію функцію. Справа в тому, що у мене є CSV з декількома тисячами рядків, і є стовпець під назвою Workclass, який містить будь-яке значення, згадане у словнику. Отже, для кожного рядка мені потрібно змінити текст у цьому стовпчику на номер, порівнявши текст зі словником і замінивши відповідне число. Як використовувати функцію для розбору стовпця за рядками та порівняння значень зі словником?
СРС

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