pyspark实践6 —— 判断dataframe中的值是否在list中,并将一列list值转成多列

# 有一个给定的list

col_search = [u'人脸',u'自拍',u'风景',u'室内',u'室外']

#有一个数据集data,包含两个字段id,tag  其中tag是一个ArrayType()型 例如:

id | tag

011 | ['儿童',‘人脸’,'室内']

012 | ['女性',‘男性’,'自拍']

#使用explode函数将tag拓展开,即list转成dataframe的行数据

data1 = data.withColumn("tag",explode("tag"))

#这时候data1就变成了如下格式:

id | tag

011 | '儿童'

011 | '人脸'

011 | '室内'

012 | '女性'

012 | '男性'

012 | '自拍'

#下面我们要判断tag中的每一行是否出现在col_search中,如果没出现则返回[0,0,0,0,0],出现的话则将出现的位置标1,这里我们使用spark上的自定义函数udf来实现

def Contain_col(p):

#5是给定搜索list的长度,在我们这里,就是上面的col_search的长度

lista = [0]*5

if p in col_search:

    idloc = col_search.index(p)

    lista[idloc] = 1

 return lista

udf_Contain_col = udf(lambda x:Contain_col(x),ArrayType(IntegerType()))

#通过上面的udf定义,我们就可以搜索元素,并将搜索的结果做为一个变量生成到dataframe中

data2 = data1.withColumn("concol",udf_Contain_col(data1["tag"]))

#此时数据的结果如下:

id | tag | concol

011 | '儿童' | [0,0,0,0,0]

011 | '人脸' | [1,0,0,0,0]

011 | '室内' | [0,0,0,1,0]

012 | '女性' | [0,0,0,0,0]

012 | '男性' | [0,0,0,0,0]

012 | '自拍' | [0,1,0,0,0]

#最后将concol列拆分成多列

data3 = data2.select([data2.id,data2.tag] + [data2.concol[i] for i in range[5]])

#此时数据的结果如下:

id | tag | concol[0] | concol[1] | concol[2] | concol[3] | concol[4]

011 | '儿童' | 0 | 0 | 0 | 0 | 0 

011 | '人脸' | 1 | 0 | 0 | 0 | 0 

011 | '室内' | 0 | 0 | 0 | 1 | 0 

012 | '女性' | 0 | 0 | 0 | 0 | 0 

012 | '男性' | 0 | 0 | 0 | 0 | 0 

012 | '自拍' | 0 | 1 | 0 | 0 | 0 

#最后根据需要可进行合并求和或求count

今天就分享这个例子,如有任何问题可以加群R语言&大数据分析456726635或者Python & Spark大数636866908与我联系。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值