Pyspark bin基于另一个变量的多列

时间:2019-05-23 10:24:25

标签: python apache-spark pyspark

我正在尝试根据另一列的值在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中。

0 个答案:

没有答案