Pyspark SAS到Pypark转换

Pyspark SAS到Pypark转换,pyspark,sas,Pyspark,Sas,我有以下SAS代码: data part1; set current.part; by DEVICE_ID part_flag_d if first.DEVICE_ID or first.part_flag_d; ITEM_NO = 0; end; else do; ITEM_NO + 1; end; run; 我正在将其转换为Pypark并被卡住。我有“

我有以下SAS代码:

   data part1;
       set current.part;
       by DEVICE_ID part_flag_d
       if first.DEVICE_ID or first.part_flag_d;
           ITEM_NO = 0;
       end;
       else do;
           ITEM_NO + 1;
       end;
   run;
我正在将其转换为Pypark并被卡住。我有“部分”数据框。我遇到的问题是试图转换以下行:

   if first.DEVICE_ID or first.part_flag_d;
我知道它会得到每列的第一个条目,但它也会检查null吗?条件说明了什么


如果您对如何编写该行脚本有任何指导,我们将不胜感激。

请参阅文档中的
by
语句:

分组处理 SAS将以下值分配给 FIRST.variable和LAST.variable:

在以下条件下,FIRST.variable的值为1:

当前观察值是读取的第一个观察值时 从数据集

不使用GROUPFORMAT选项和的内部值时 当前观测值中的变量与内部变量不同 上一次观察中的值

如果使用GROUPFORMAT选项,FIRST.variable的值为1 当前观测值中变量的格式化值 与上一次观察中的格式化值不同

FIRST.variable对于BY中任何前面的变量的值为1 声明

在所有其他情况下,FIRST.variable的值为0

在以下条件下,LAST.variable的值为1:

  • 当前观测值是从中读取的最后一个观测值时 数据集

  • 当您使用GROUPFORMAT选项和 当前观测值中的变量与中的内部值不同 下一个观察结果

如果使用GROUPFORMAT选项,则当 当前观测值中变量的格式值不同 从下一个观察中的格式化值

对于BY中的任何前一个变量,LAST.variable的值为1 声明

在所有其他情况下,LAST.variable的值为0


请参阅下面的代码。它是由名为SPROCKET的自动转换工具生成的,您可以找到有关它的信息

它应该首先处理
变量

# DATASTEP
part1 = (
    CURRENT_part_df # change to your set df name
    .withColumn('_first_DEVICE_ID', when(
        row_number().over(Window.partitionBy(['part_flag_d']).orderBy('DEVICE_ID')) == 1, 1)
        .otherwise(lit(0)))
    # WARNING: NO ORDER DETECTED, MANUALLY SPECIFY ORDER VARIABLE
    .withColumn('_first_part_flag_d', when(
        row_number().over(Window.partitionBy(['DEVICE_ID','part_flag_d']).orderBy("")) == 1, 1)
        .otherwise(lit(0)))
    .withColumn('ITEM_NO', expr("""case
        when (_first_DEVICE_ID > 0 or _first_part_flag_d > 0) then 0
        when not ((_first_DEVICE_ID > 0 or _first_part_flag_d > 0)) then ITEM_NO + 1
        else ITEM_NO end"""))
    .drop('_first_DEVICE_ID')
    .drop('_first_part_flag_d')
)

为简单起见,您始终可以将两列串联起来,并在
情况下使用
if first.concated_col
。也就是说,当然还有很多其他的方法。