Я пытаюсь объединить несколько переменных в 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.