我正在尝试根据另一列的值在pyspark的N个bin中对多个变量进行bin。我知道我可以使用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))
编辑其他示例
基本上我想做this,但是在PySpark中。