我目前有一个 Dataframe ,其中显示了用户id、日期和y_n列,如下所示:
| 用户标识|日期|是(_N)|
| - -|- -|- -|
| 一个|2022年6月1日|不|
| 一个|2022年6月5日|Y型|
| 一个|2022年6月20日|不|
| 2个|2022年6月1日|不|
| 2个|2022年6月2日|不|
| 2个|2022年7月7日|Y型|
| 2个|2022年7月7日|不|
| 2个|2022年7月8日|不|
我尝试对任何给定的用户,如果他们在任何之前的日期有Y,我已经在下面添加了一列,any_previous_y,它显示了预期的结果。
| 用户标识|日期|是(_N)|任何上一个|
| - -|- -|- -|- -|
| 一个|2022年6月1日|不|不|
| 一个|2022年6月5日|Y型|不|
| 一个|2022年6月20日|不|Y型|
| 2个|2022年6月1日|不|不|
| 2个|2022年6月2日|不|不|
| 2个|2022年7月7日|Y型|不|
| 2个|2022年7月7日|不|不|
| 2个|2022年7月8日|不|Y型|
在这里,您可以看到user_id 1在2022-06-05的值为Y,因此其2022-06-20记录的any_previous_y值为Y。请注意,user_id 2在2022-07-07有两个记录,我希望这两个记录的any_previous_y值都为N,因为在这一天之前,它们的值都不为Y。
我一直在尝试使用partitionBy()派生此列,但到目前为止,我还无法获得所需的内容。
1条答案
按热度按时间6za6bjd01#
您可以使用
lag
并按date
和y_n
字段排序。由于在排序时,"Y"
会出现在"N"
之后,因此即使在同一日期有2个值,lag也会提供"Y"
。另一种方法是使用数组和
array_contains
。您将同一日期的所有Y/N收集到一个数组中,并检查该数组中的前一个日期是否有"Y"
。