Cách chuyển đổi dữ liệu phân loại thành dữ liệu số trong Pyspark


11

Tôi đang sử dụng máy tính xách tay Ipython để làm việc với các ứng dụng pyspark. Tôi có một tệp CSV có nhiều cột phân loại để xác định xem thu nhập có nằm trong hoặc trên phạm vi 50k hay không. Tôi muốn thực hiện một thuật toán phân loại lấy tất cả các yếu tố đầu vào để xác định phạm vi thu nhập. Tôi cần xây dựng một từ điển các biến để ánh xạ các biến và sử dụng hàm ánh xạ để ánh xạ các biến thành số để xử lý. Về cơ bản, tôi sẽ tập dữ liệu của mình ở định dạng số để tôi có thể thực hiện các mô hình.

Trong bộ dữ liệu, có các cột phân loại như giáo dục, tình trạng hôn nhân, tầng lớp lao động, v.v ... Ai đó có thể cho tôi biết làm thế nào để chuyển đổi chúng thành các cột số trong pyspark không?

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}

Tôi đã tạo một từ điển mẫu với các cặp giá trị chính cho lớp công việc. Nhưng, tôi không biết cách sử dụng chức năng này trong chức năng bản đồ và thay thế dữ liệu phân loại trong tệp CSV bằng giá trị tương ứng.

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)

Đây là mã tôi đã viết bằng python bình thường để chuyển đổi dữ liệu phân loại thành dữ liệu số. Nó hoạt động tốt. Tôi muốn thực hiện chuyển đổi trong bối cảnh tia lửa. Và, có 9 cột phân loại trong nguồn dữ liệu. Có cách nào để tự động hóa quá trình cập nhật từ điển để có một cặp KV cho tất cả 9 cột không?

Câu trả lời:


14

Điều này có thể được thực hiện bằng cách sử dụng StringIndexertrong PySpark và ngược lại sử dụng IndexToStringđể tham khảo vui lòng kiểm tra điều này:

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

Để biết thêm chi tiết, xin vui lòng kiểm tra tài liệu tia lửa


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}

hãy thử xác định một bản đồ ánh xạ mà trả về khóa:

def mapr(dict_key):
    return workclass[dict_key]

print list(map(mapr,workclass))

Này, bạn có thể vui lòng giải thích cho tôi khối này làm gì không? Tôi đã chạy tập lệnh của mình với mã này được thêm vào và tôi nhận được [6, 1, 4, 3, 5, 7, 8, 0, 2] làm đầu ra. Tôi muốn thay thế các giá trị số cho nội dung của lớp công việc bằng cách sử dụng các giá trị trong từ điển.
SRS

Xin chào, Hàm mapr sẽ trả về giá trị số được liên kết với giá trị danh mục. ví dụ: 6 cho 'Self-emp-not-inc', từ điển python không có thứ tự. Nếu bạn muốn có một từ điển theo thứ tự, hãy thử bộ sưu tập.OrderedDict.
Sreejithc321

Được rồi, bây giờ tôi hiểu chức năng. Vấn đề là, tôi có một CSV với vài nghìn hàng và có một cột có tên là Workgroup chứa bất kỳ một giá trị nào được đề cập trong từ điển. Vì vậy, đối với mỗi hàng, tôi cần thay đổi văn bản trong cột đó thành một số bằng cách so sánh văn bản với từ điển và thay thế số tương ứng. Làm cách nào để sử dụng hàm để phân tích cột theo hàng và so sánh các giá trị với từ điển?
SRS

Bạn có thể tạo một cột bổ sung, giả sử 'workgroup_num' lưu trữ các giá trị số tương ứng với giá trị phân loại. Kiểm tra thư viện Python Pandas.
Sreejithc321
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.