Вы можете сделать это с помощью оконной функции max
, чтобы обозначить группу (разделенную на col1), которая имеет 'X' в col2 с идентификатором (в данном случае 1). Группам, у которых нет 'X', присваивается null
. После этого просто отфильтруйте промежуточный кадр данных, чтобы получить желаемый результат.
from pyspark.sql import Window
from pyspark.sql.functions import max,when
w = Window.partitionBy(df.col1)
df_1 = df.withColumn('x_exists',max(when(df.col2 == 'X',1)).over(w))
df_2 = df_1.filter(((df_1.x_exists == 1) & (df_1.col2 == 'X')) | df_1.x_exists.isNull())
df_2.show()