根据数据框组在数据框中添加新列

时间:2018-07-20 14:08:06

标签: python python-3.x pandas

给出数据框 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())

1 个答案:

答案 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函数来解决您的问题。