问题描述
我下面有一个数据框:
我想根据流程和工位显示以下行
解决方法
尝试使用 split
并获取代码值,然后使用expr
过滤记录。
Example:
df.show()
#+------+-------+-------+--------+
#| code|process|station|sequence|
#+------+-------+-------+--------+
#|CODE-1| ab| ab| 1|
#|CODE-1| ab| xy| 2|
#|CODE-1| ab| op| 3|
#|CODE-1| ab| ac| 4|
#|CODE-2| xy| ab| 1|
#|CODE-2| xy| xy| 2|
#|CODE-2| xy| op| 3|
#|CODE-2| xy| ac| 4|
#|CODE-3| op| ab| 1|
#|CODE-3| op| xy| 2|
#|CODE-3| op| op| 3|
#|CODE-3| op| ac| 4|
#|CODE-4| ac| ab| 1|
#|CODE-4| ac| xy| 2|
#|CODE-4| ac| op| 3|
#|CODE-4| ac| ac| 4|
#+------+-------+-------+--------+
from pyspark.sql.functions import *
df.withColumn("tmp",split(col("code"),"-")[1]).\
filter(expr('sequence >= tmp')).\
drop(*["tmp"]).\
show()
#+------+-------+-------+--------+
#| code|process|station|sequence|
#+------+-------+-------+--------+
#|CODE-1| ab| ab| 1|
#|CODE-1| ab| xy| 2|
#|CODE-1| ab| op| 3|
#|CODE-1| ab| ac| 4|
#|CODE-2| xy| xy| 2|
#|CODE-2| xy| op| 3|
#|CODE-2| xy| ac| 4|
#|CODE-3| op| op| 3|
#|CODE-3| op| ac| 4|
#|CODE-4| ac| ac| 4|
#+------+-------+-------+--------+
Option-2:
使用 df.replace()
,然后使用expr
进行过滤。
replace_dict={"ab":"1","xy":"2","op":"3","ac":"4"}
df.withColumn("tmp",col("process")).\
replace(replace_dict,subset='tmp').\
filter(expr('sequence >= tmp')).\
drop(*["tmp"]).\
show()
#+------+-------+-------+--------+
#| code|process|station|sequence|
#+------+-------+-------+--------+
#|CODE-1| ab| ab| 1|
#|CODE-1| ab| xy| 2|
#|CODE-1| ab| op| 3|
#|CODE-1| ab| ac| 4|
#|CODE-2| xy| xy| 2|
#|CODE-2| xy| op| 3|
#|CODE-2| xy| ac| 4|
#|CODE-3| op| op| 3|
#|CODE-3| op| ac| 4|
#|CODE-4| ac| ac| 4|
#+------+-------+-------+--------+