Bagaimana mengkonversi data kategorikal menjadi data numerik di Pyspark

11

Saya menggunakan notebook Ipython untuk bekerja dengan aplikasi pyspark. Saya memiliki file CSV dengan banyak kolom kategorikal untuk menentukan apakah pendapatan berada di bawah atau di atas kisaran 50k. Saya ingin melakukan algoritma klasifikasi mengambil semua input untuk menentukan kisaran pendapatan. Saya perlu membuat kamus variabel untuk memetakan variabel dan menggunakan fungsi peta untuk memetakan variabel ke angka untuk diproses. Pada dasarnya, saya ingin dataset saya dalam format numerik sehingga saya dapat bekerja pada penerapan model.

Dalam kumpulan data, ada kolom kategorikal seperti pendidikan, status perkawinan, kelas pekerja dll. Dapatkah seseorang memberi tahu saya cara mengubahnya menjadi kolom angka di 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}

Saya membuat kamus sampel dengan pasangan nilai kunci untuk kelas kerja. Tapi, saya tidak tahu cara menggunakannya di fungsi peta dan mengganti data kategorikal dalam file CSV dengan nilai yang sesuai.

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)

Ini adalah kode yang saya tulis dengan python normal untuk mengubah data kategorikal menjadi data numerik. Ini bekerja dengan baik. Saya ingin melakukan konversi dalam konteks percikan. Dan, ada 9 kolom kategori dalam sumber data. Apakah ada cara untuk mengotomatiskan proses pembaruan kamus untuk memiliki pasangan KV untuk semua 9 kolom?

SRS
sumber

Jawaban:

14

Ini dapat dilakukan menggunakan StringIndexerdi PySpark dan sebaliknya menggunakan IndexToStringuntuk referensi, silakan periksa ini:

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

Untuk detail lebih lanjut, silakan periksa dokumentasi percikan

krishna Prasad
sumber
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}

coba tentukan fungsi mapper yang mengembalikan kunci:

def mapr(dict_key):
    return workclass[dict_key]

print list(map(mapr,workclass))
Sreejithc321
sumber
Hei, bisa tolong jelaskan padaku apa yang dilakukan blok ini? Saya menjalankan skrip saya dengan kode ini ditambahkan dan saya mendapatkan [6, 1, 4, 3, 5, 7, 8, 0, 2] sebagai hasilnya. Saya ingin mengganti nilai numerik ke konten kelas kerja menggunakan nilai-nilai dalam kamus.
SRS
Hai, Fungsi mapr akan mengembalikan nilai numerik yang terkait dengan nilai kategori. misal: 6 untuk 'Self-emp-not-inc', kamus python tidak diurutkan. Jika Anda ingin kamus yang dipesan, coba koleksi.OrderedDict.
Sreejithc321
Oke, sekarang saya mengerti fungsinya. Masalahnya adalah, saya memiliki CSV dengan beberapa ribu baris dan ada kolom bernama Workclass yang berisi salah satu nilai yang disebutkan dalam kamus. Jadi, untuk setiap baris, saya perlu mengubah teks di kolom itu menjadi angka dengan membandingkan teks dengan kamus dan mengganti nomor yang sesuai. Bagaimana cara menggunakan fungsi untuk mem-parsing kolom dengan baris dan membandingkan nilai dengan kamus?
SRS
Anda dapat membuat kolom tambahan, ucapkan 'workclass_num' yang menyimpan nilai numerik yang sesuai dengan nilai kategorikal. Periksa perpustakaan Python Pandas.
Sreejithc321