如何在pyspark做年龄段?

时间:2017-05-25 17:48:32

标签: dataframe pyspark rdd

假设我有一个带有数字列Age的数据框。

我想根据Age

中的值生成一个新列

这样的事情:

   Age       |    New Age Range
-----------------------------------
    4        |        0-18
   25        |        19-65
   90        |        65+
  ....       |        ....

我想过使用一个函数......

def AgeByRange(Age):
  for i in Age:
    if i < 19:
      return '0-18'
    elif ......

我怀疑有更好的方法可以做到这一点。

2 个答案:

答案 0 :(得分:0)

您好,您只需使用范围创建DataFrame并使用连接,例如

from pyspark.sql.types import *
df = sqlctx.createDataFrame([(1),(25),(90)],IntegerType()).withColumnRenamed('value','age')

df2 = sqlctx.createDataFrame([(0,18,'0-18'),(19,65,'19-65'),(65,99999,'65+')],['age_f','age_to','range'])

df_joined =df.join(df2,(df.age>= df2.age_f) & (df.age<=df2.age_to),'inner').select(df.age,df2.range).show()

答案 1 :(得分:0)

嗨,您可以使用sql函数udf和withColumn

from pyspark.sql.functions import udf
 age_range = udf(lambda age: '< 20' if age < 20 else 
                       '20-25' if (age >= 20 and age < 25) else
                       '25-30' if (age >= 25 and age < 30) else
                       '30-35' if (age >= 30 and age < 35) else
                       '35-40' if (age >= 35 and age < 40) else
                       '40-45' if (age >= 40 and age < 45) else
                       '45-50' if (age >= 45 and age < 50) else
                       '50-55' if (age >= 50 and age < 55) else
                       '55-60' if (age >= 55 and age < 60) else
                       '60-65' if (age >= 60 and age < 65) else
                       '65-70' if (age >= 65 and age < 70) else
                        '75+'  if (age >= 70) else '')

 df = df.withColumn('age_range', age_range(df.Age))