繁体   English   中英

如何根据pyspark中的其他列移动列

[英]How to shift a column based on other columns in pyspark

我需要根据 pyspark 中数据框中的 Col2 和 Col3 列将 Col4 向左移动。 Col4 值应在 col2 连续更改时更改。 Col3 主要跟踪 Col2 值的新序列。 Col1 还应该对最终输出进行分区。 输出应该类似于 shift_col4。

ID  Col1 Col2 Col3 Col4 shift_col4
1    1   10   1    4     null
2    1   11   1    8     4
3    1   12   1   12     8
4    1   1    2   16     12
5    1   3    2   20     16
4    2   1    1   16     null
5    2   4    1   20     16

我不知道您是否只需要查看 Col2 是否更改为移位(推送)Col4,需要更多信息,但我这样做是基于 Col2 每次更改时都会将 Col4 的值向前推。

w = Window.partitionBy('Col1').orderBy('ID', 'Col1')
df = df.withColumn('shift_4', f.when(f.lag('Col2').over(w) != f.col('Col2'), f.lag('Col4').over(w)))
df.show()
+---+----+----+----+----+-------+
| ID|Col1|Col2|Col3|Col4|shift_4|
+---+----+----+----+----+-------+
|  1|   1|  10|   1|   4|   null|
|  2|   1|  11|   1|   8|      4|
|  3|   1|  12|   1|  12|      8|
|  4|   1|   1|   2|  16|     12|
|  5|   1|   2|   2|  20|     16|
|  4|   2|   1|   1|  16|   null|
|  5|   2|   2|   1|  20|     16|
+---+----+----+----+----+-------+

如果您需要跟踪 Col2 序列并且只是在更改中断时进行更改,您可以创建另一个窗口函数并使用 rank 来查看它,然后将其包含在when函数的逻辑中。 在这种情况下,您可以查看这个问题,它可能会对您有所帮助: Counting Continuous occurrences of a specific value in PySpark

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM