我有这样一个Dataframe:
+-----+----+----+--------+
|index|name| Num|solution|
+-----+----+----+--------+
| 0| a|1000| true|
| 1| a|2000| true|
| 2| a| 300| false|
| 3| a| 400| true|
| 4| a|2100| true|
| 5| a|2200| true|
+-----+----+----+--------+
我现在想更新我的解决方案列。如果值( Num
)在第一次达到或超过“drop”(这里drop之前的值是2000)之前,我想将所有bools从“drop”开始设置为false,直到该点之后。因此,预期结果将是:
+-----+----+----+---------------+
|index|name| Num|solution_update|
+-----+----+----+---------------+
| 0| a|1000| true|
| 1| a|2000| true|
| 2| a| 300| false|
| 3| a| 400| false|
| 4| a|2100| false|
| 5| a|2200| true|
+-----+----+----+---------------+
我觉得我缺少了解决这个问题的基本思路:-
我可以在拖放前检测行中的值:
my_window = Window.partitionBy('name').orderBy(F.col('index'))
df= df.withColumn('lag1', F.lag(F.col('Num'), -1)
.over(my_window).cast('bigint'))
df= df.withColumn('help',
(F.when((F.col('lag1'))
< (F.col('Num')), False)))
+-----+----+----+--------+----+-----+
|index|name| Num|solution|lag1| help|
+-----+----+----+--------+----+-----+
| 0| a|1000| true|2000| null|
| 1| a|2000| true| 300|false|
| 2| a| 300| false| 400| null|
| 3| a| 400| true|2100| null|
| 4| a|2100| true|2200| null|
| 5| a|2200| true|null| null|
+-----+----+----+--------+----+-----+
但现在我不知道如何搜索“第一个值等于或大于”比
df.where(F.col('help')==False)['Num']
有人能帮忙吗?
2条答案
按热度按时间y1aodyip1#
这可不容易。我会这样做的。希望这些列是不言自明的:)但是一定要问你是否不清楚任何列的含义。
2vuwiymt2#
还有一种方法: