给出数据框 df
userid tripid Transportation_Mode Altitude
1 1 walk 20
1 1 walk 22
1 1 walk 22
1 1 bike 24
1 1 bike 22
1 1 walk 25
1 1 walk 27
1 1 walk 22
1 1 car 26
1 1 car 21
1 1 car 27
1 2 car 22
1 2 car 24
1 2 car 22
1 2 walk 22
1 2 walk 24
2 1 bike 27
2 1 bike 21
2 1 bike 26
我喜欢这样添加新列 segmentid
userid tripid Transportation_Mode Altitude Segmentid
1 1 walk 20 1
1 1 walk 22 1
1 1 walk 22 1
1 1 bike 24 2
1 1 bike 22 2
1 1 walk 25 3
1 1 walk 27 3
1 1 walk 22 3
1 1 car 26 4
1 1 car 21 4
1 1 car 27 4
1 2 car 22 1
1 2 car 24 1
1 2 car 22 1
1 2 walk 22 2
1 2 walk 24 2
2 1 bike 27 1
2 1 bike 21 1
2 1 bike 26 1
段是每个用户从1开始的数字序列。用户有多个行程,每个行程包含多种运输方式。每当用户更改运输方式时,都应增加1。当三位一体或用户名改变时,应从1重新开始。
我尝试使用此代码,但没有得到正确的结果。
df['segmentid'] = df.groupby([userid,tripid]).Transportation_Mode.apply(lambda x: x.ne(x.shift(1)).cumsum())
答案 0 :(得分:1)
我不知道该怎么做,但我可能有一个或两个主意。
为了添加新列,您可以使用withColumn(colName, col)
函数。此函数将创建一个新列,其值可以使用UDF UserDefinedFunction
如下确定:
from pyspark.sql.functions import udf
squared_udf = udf(squared, LongType())
df = sqlContext.table("test")
display(df.select("id", squared_udf("id").alias("id_squared")))
但是,在您的情况下,必须在添加新列之前计算不同组的数量。对于您的情况,您可以创建一个Dict
来存储每个组以及要提供的相应值。然后,您可以在UDF中为每个记录分配匹配的值。
寻找WithColumn()
和UDF
函数来解决您的问题。