获取数据框列中列表的最后一个元素

时间:2020-10-20 13:26:07

标签: python pyspark

我的spark数据框由3列组成,每列都是列表。每行的列表长度可能会有所不同。 例如,我的数据框看起来像

Input

我希望能够获得这些列表的最后一个元素。 预期产量 Expected Output

有一篇帖子使用以下内容获取列表的第一个元素 df = df.withColumn(“ First_item_Col1”,df ['Col1'] [0])

但是当我使用-1获取上一行的最后一项时,它给了我空值

2 个答案:

答案 0 :(得分:2)

您可以将lambda函数应用于Col1和Col2并获取最后一项,如下所示:

df['Last_Col1']=df['Col1'].apply(lambda x: x[-1])
df['Last_Col2']=df['Col2'].apply(lambda x: x[-1])

输出:

>>> print(df)

           Col1          Col2 Last_Col1 Last_Col2
0        [X, X]        [A, B]         X         B
1           [Y]           [B]         Y         B
2     [X, Y, Z]        [A, C]         Z         C
3  [X, Y, Y, Z]  [A, B, B, C]         Z         C

答案 1 :(得分:0)

您可以使用Spark高阶函数-element_at,以便从如下所示的列表列中获取最后一个元素

创建数据框

df = spark.createDataFrame([(1,['x','x']),(2,['y']),(3,['x','y','z']),(4,['x','y','y','z'])],[ "col1","col2"])
df.show(truncate=False)
+----+------------+
|col1|col2        |
+----+------------+
|1   |[x, x]      |
|2   |[y]         |
|3   |[x, y, z]   |
|4   |[x, y, y, z]|
+----+------------+

解决方案

df = df.withColumn("list_col", F.element_at(F.col('col2'), -1).alias('1st_from_end'))
df.show(truncate=False)
+----+------------+--------+
|col1|col2        |list_col|
+----+------------+--------+
|1   |[x, x]      |x       |
|2   |[y]         |y       |
|3   |[x, y, z]   |z       |
|4   |[x, y, y, z]|z       |
+----+------------+--------+