Jak przekonwertować dane kategoryczne na dane liczbowe w Pyspark

11

Używam notatnika Ipython do pracy z aplikacjami pyspark. Mam plik CSV z dużą ilością podzielonych na kategorie kolumn, aby ustalić, czy dochód mieści się w przedziale 50k, czy powyżej. Chciałbym wykonać algorytm klasyfikacji, biorąc wszystkie dane wejściowe w celu ustalenia zakresu dochodów. Muszę zbudować słownik zmiennych do mapowanych zmiennych i użyć funkcji mapowania do mapowania zmiennych na liczby w celu przetworzenia. Zasadniczo chciałbym, aby mój zestaw danych był w formacie liczbowym, aby móc pracować nad implementacją modeli.

W zestawie danych znajdują się podzielone na kategorie kolumny, takie jak edukacja, stan cywilny, klasa robotnicza itp. Czy ktoś może mi powiedzieć, jak przekonwertować je na kolumny liczbowe w 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}

Stworzyłem przykładowy słownik z parami kluczowych wartości dla klasy robotniczej. Ale nie wiem, jak tego użyć w funkcji mapy i zastąpić dane kategoryczne w pliku CSV odpowiednią wartością.

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)

To jest kod, który napisałem w normalnym pythonie, aby przekonwertować dane kategoryczne na dane liczbowe. To działa dobrze. Chcę dokonać konwersji w kontekście iskry. W źródle danych znajduje się 9 kategorycznych kolumn. Czy istnieje sposób na zautomatyzowanie procesu aktualizacji słownika w celu uzyskania pary KV dla wszystkich 9 kolumn?

SRS
źródło

Odpowiedzi:

14

Można to zrobić za pomocą StringIndexerPySpark i odwrotnie za pomocą, IndexToStringsprawdź to:

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

Aby uzyskać więcej informacji, sprawdź dokumentację Spark

krishna Prasad
źródło
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}

spróbuj zdefiniować funkcję mapowania, która zwraca klucz:

def mapr(dict_key):
    return workclass[dict_key]

print list(map(mapr,workclass))
Sreejithc321
źródło
Hej, czy mógłbyś mi wyjaśnić, co robi ten blok? Uruchomiłem skrypt z tym kodem i otrzymałem [6, 1, 4, 3, 5, 7, 8, 0, 2] jako wynik. Chcę zastąpić wartości liczbowe zawartością klasy robotniczej za pomocą wartości ze słownika.
SRS
Cześć, funkcja mapr zwróci wartość liczbową powiązaną z wartością kategorii. np .: 6 dla „Self-emp-not-inc” słowniki python są nieuporządkowane. Jeśli chcesz uporządkowanego słownika, wypróbuj kolekcje.
Sreejithc321
Okej, teraz rozumiem funkcję. Chodzi o to, że mam plik CSV z kilkoma tysiącami wierszy, a kolumna o nazwie Workclass zawiera dowolną wartość wymienioną w słowniku. Tak więc dla każdego wiersza muszę zmienić tekst w tej kolumnie na liczbę, porównując tekst ze słownikiem i podstawiając odpowiednią liczbę. Jak używać funkcji do analizowania kolumny według wierszy i porównywania wartości ze słownikiem?
SRS
Możesz utworzyć dodatkową kolumnę, powiedz „workclass_num”, która przechowuje wartości liczbowe odpowiadające wartościom kategorialnym. Sprawdź bibliotekę Python Pandas.
Sreejithc321