Pyspark SAS到Pypark转换
我有以下SAS代码: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并被卡住。我有“
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选项和 当前观测值中的变量与中的内部值不同 下一个观察结果
请参阅下面的代码。它是由名为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
。也就是说,当然还有很多其他的方法。