2016-04-29 28 views
15

Tôi có một dataframe PySparkÁp dụng StringIndexer đến một số cột trong một PySpark Dataframe

+-------+--------------+----+----+ 
|address|   date|name|food| 
+-------+--------------+----+----+ 
|1111111|20151122045510| Yin|gre | 
|1111111|20151122045501| Yin|gre | 
|1111111|20151122045500| Yln|gra | 
|1111112|20151122065832| Yun|ddd | 
|1111113|20160101003221| Yan|fdf | 
|1111111|20160703045231| Yin|gre | 
|1111114|20150419134543| Yin|fdf | 
|1111115|20151123174302| Yen|ddd | 
|2111115|  2| Yen|gre | 
+-------+--------------+----+----+ 

mà tôi muốn chuyển đổi để sử dụng với pyspark.ml. Tôi có thể sử dụng một StringIndexer để chuyển đổi các cột tên vào một danh mục số:

indexer = StringIndexer(inputCol="name", outputCol="name_index").fit(df) 
df_ind = indexer.transform(df) 
df_ind.show() 
+-------+--------------+----+----------+----+ 
|address|   date|name|name_index|food| 
+-------+--------------+----+----------+----+ 
|1111111|20151122045510| Yin|  0.0|gre | 
|1111111|20151122045501| Yin|  0.0|gre | 
|1111111|20151122045500| Yln|  2.0|gra | 
|1111112|20151122065832| Yun|  4.0|ddd | 
|1111113|20160101003221| Yan|  3.0|fdf | 
|1111111|20160703045231| Yin|  0.0|gre | 
|1111114|20150419134543| Yin|  0.0|fdf | 
|1111115|20151123174302| Yen|  1.0|ddd | 
|2111115|  2| Yen|  1.0|gre | 
+-------+--------------+----+----------+----+ 

Làm thế nào tôi có thể chuyển đổi nhiều cột với StringIndexer (ví dụ, namefood, đều có riêng của mình StringIndexer) và sau đó sử dụng VectorAssembler để tạo một vector tính năng? Hoặc tôi có phải tạo một StringIndexer cho mỗi cột không?

** EDIT **: Đây không phải là bản dupe vì tôi cần phải lập trình này cho một số khung dữ liệu có tên cột khác nhau. Tôi không thể sử dụng VectorIndexer hoặc VectorAssembler vì các cột không phải là số.

** EDIT 2 **: Một giải pháp dự kiến ​​là

indexers = [StringIndexer(inputCol=column, outputCol=column+"_index").fit(df).transform(df) for column in df.columns ] 

nơi tôi có thể tạo một danh sách bây giờ với ba dataframes, mỗi giống hệt với bản gốc cộng với cột chuyển. Bây giờ tôi cần phải tham gia sau đó để tạo thành khung dữ liệu cuối cùng, nhưng điều đó rất không hiệu quả.

+1

có thể trùng lặp của [Mã hóa và lắp ráp nhiều tính năng trong PySpark] (http://stackoverflow.com/questions/32982425/encode-and-assemble-multiple-features-in-pyspark) – zero323

+0

Tương tự nhưng không thực sự. Anh ta đang làm một cột tại một thời điểm cho mỗi chỉ mục chuỗi và tôi cần phải làm với một số cột cùng một lúc, mà không làm mỗi tách – Ivan

+0

Sau đó, nó không phải là có thể. Điều gì sẽ là ngay cả đầu ra? – zero323

Trả lời

23

Cách tốt nhất mà tôi đã tìm thấy để làm điều đó là để kết hợp nhiều StringIndex trên một danh sách và sử dụng một Pipeline để thực hiện chúng tất cả:

from pyspark.ml import Pipeline 
from pyspark.ml.feature import StringIndexer 

indexers = [StringIndexer(inputCol=column, outputCol=column+"_index").fit(df) for column in list(set(df.columns)-set(['date'])) ] 


pipeline = Pipeline(stages=indexers) 
df_r = pipeline.fit(df).transform(df) 

df_r.show() 
+-------+--------------+----+----+----------+----------+-------------+ 
|address|   date|food|name|food_index|name_index|address_index| 
+-------+--------------+----+----+----------+----------+-------------+ 
|1111111|20151122045510| gre| Yin|  0.0|  0.0|   0.0| 
|1111111|20151122045501| gra| Yin|  2.0|  0.0|   0.0| 
|1111111|20151122045500| gre| Yln|  0.0|  2.0|   0.0| 
|1111112|20151122065832| gre| Yun|  0.0|  4.0|   3.0| 
|1111113|20160101003221| gre| Yan|  0.0|  3.0|   1.0| 
|1111111|20160703045231| gre| Yin|  0.0|  0.0|   0.0| 
|1111114|20150419134543| gre| Yin|  0.0|  0.0|   5.0| 
|1111115|20151123174302| ddd| Yen|  1.0|  1.0|   2.0| 
|2111115|  2| ddd| Yen|  1.0|  1.0|   4.0| 
+-------+--------------+----+----+----------+----------+-------------+ 
+0

Tôi có một vòng lặp lặp lại với phân bổ lại bên trong. Mã xấu nhất trong vũ trụ .. Đoán rằng đã đến lúc đầu tư một chút nỗ lực và chuyển sang 'Đường ống' một lần và mãi mãi! – avloss

+4

Bạn có thực sự cần 'fit' trong' indexers' không? Bạn đang chạy 'fit' trong' pipeline'. –

Các vấn đề liên quan