Pyspark bin несколько столбцов на основе другой переменной - PullRequest
0 голосов
/ 23 мая 2019

Я пытаюсь объединить несколько переменных в N корзин в pyspark, основываясь на значении другого столбца. Я знаю, что могу использовать Quantilediscretizer , но в Python он принимает только один столбец за раз, в то время как в Scala он принимает несколько. Я пытался перебрать переменные, но у меня их слишком много, и это занимает вечность. Еще одна вещь, которую я хочу сделать, это переместить переменные в зависимости от значения другого столбца.

Например, у меня есть X переменных (рост, вес, часы сна, доход и т. д.) и одной переменной является профессия (безработный, инженер, экономист, учитель и т. д.) Я хочу, чтобы переменные для каждого профессия, поэтому я могу сравнить их позже.

Как я могу сделать это в PySpark, эффективным способом ?

То, как я делаю это прямо сейчас, - это сгенерировать фрейм данных для каждой профессии, а затем для каждой из них перебрать переменные, чтобы их скопировать. После этого я объединяю их.

import pandas as pd
from pyspark.sql import functions as F

from pyspark.sql import HiveContext
from pyspark.ml.feature import QuantileDiscretizer

df = hive_context.createDataFrame(pd.DataFrame({'Profession':[1,1,2,3,4,4,4,5],
     'Age':[20,21,80,85,20,10,50,18],
     'Weight':[78,71,90,100,60,58,89,74],
     'Income':[100,80,890,185,40,35,50,18]}))

professions = list(df.select('profession').distinct().sort('profession').toPandas().reset_index()['profession']) # List with professions encoded as integers

stages = []

for col in variables:
    discretizer = QuantileDiscretizer(numBuckets=10,inputCol=col,outputCol="{}_discretizada".format(col))
    stages.append(discretizer)

pipeline = Pipeline(stages=stages)

count = 0
for profession in professions:
    print("Calculating profession {}".format(profession))
    if count == 0:
        d = df.where(F.col('profession') == int(profession))
        datos = pipeline.fit(d).transform(d)
        count = count + 1
    else:
        d = df.where(F.col('profession') == int(profession))
        aux = pipeline.fit(d).transform(d)
        datos = datos.union(aux.select(datos.columns))

РЕДАКТИРОВАТЬ С ДРУГИМ ПРИМЕРОМ

В основном я хочу сделать это , но в PySpark.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...