Pyspark'ta kategorik verileri sayısal verilere dönüştürme


11

Pyspark uygulamaları ile çalışmak için Ipython dizüstü bilgisayar kullanıyorum. Gelir 50k aralığının altında veya altında olup olmadığını belirlemek için çok sayıda kategorik sütun içeren bir CSV dosyası var. Gelir aralığını belirlemek için tüm girdileri alarak bir sınıflandırma algoritması yapmak istiyorum. Eşlenen değişkenler için değişkenler sözlüğü oluşturmak ve değişkenleri işlemek için sayıları eşlemek için bir harita işlevi kullanmanız gerekir. Temel olarak, veri setimin sayısal bir biçimde olmasını isterdim, böylece modelleri uygulamak için çalışabilirim.

Veri setinde, eğitim, medeni durum, işçi sınıfı vb. Kategorik sütunlar var.

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}

İş sınıfı için anahtar değer çiftleriyle örnek bir sözlük oluşturdum. Ancak, bunu bir harita işlevinde nasıl kullanılacağını ve CSV dosyasındaki kategorik verileri karşılık gelen değerle nasıl değiştireceğim bilmiyorum.

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)

Bu kategorik verileri sayısal verilere dönüştürmek için normal python'da yazdığım kod. İyi çalışıyor. Dönüşümü kıvılcım bağlamında yapmak istiyorum. Ve veri kaynağında 9 kategorik sütun vardır. Sözlük güncelleme işlemini 9 sütunun tümü için bir KV çiftine sahip olacak şekilde otomatikleştirmenin bir yolu var mı?

Yanıtlar:


14

Bu, StringIndexerPySpark'ta yapılabilir ve IndexToStringreferans için tersini kullanarak lütfen bunu kontrol edin:

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

Daha fazla ayrıntı için lütfen kıvılcım belgelerine bakın


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}

anahtarı döndüren bir haritacı işlevi tanımlamayı deneyin:

def mapr(dict_key):
    return workclass[dict_key]

print list(map(mapr,workclass))

Hey, lütfen bana bu bloğun ne yaptığını açıklar mısınız? Senaryoyu bu kod eklenerek çalıştırdım ve çıktı olarak [6, 1, 4, 3, 5, 7, 8, 0, 2] aldım. Sözlükteki değerleri kullanarak iş sınıfı içeriğine sayısal değerleri koymak istiyorum.
SRS

Merhaba, mapr işlevi, kategori değeriyle ilişkili sayısal değeri döndürür. örneğin: 'Self-emp-not-inc' için 6, python sözlükleri sıralanmamıştır. Sıralı bir sözlük istiyorsanız collections.OrderedDict'i deneyin.
Sreejithc321

Tamam, şimdi işlevi anlıyorum. Mesele şu ki, birkaç bin satırlı bir CSV var ve sözlükte belirtilen değerlerden herhangi birini içeren Workclass adlı bir sütun var. Yani, her satır için, metni sözlükle karşılaştırarak ve ilgili sayıyı değiştirerek o sütundaki metni bir sayıya değiştirmem gerekiyor. Sütunu satırlara göre ayrıştırmak ve değerleri sözlükle karşılaştırmak için bir işlevi nasıl kullanabilirim?
SRS

Kategorik değere karşılık gelen sayısal değerleri depolayan 'workclass_num' gibi ek bir sütun oluşturabilirsiniz. Python Pandas kütüphanesini kontrol edin.
Sreejithc321
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.