Dataframe 筛选但保留空行

Dataframe 筛选但保留空行,dataframe,pyspark,apache-spark-sql,Dataframe,Pyspark,Apache Spark Sql,我有一个融化的数据框,看起来像这样: # +---+--------+----------+ # | id| c_type|c_type_val| # +---+--------+----------+ # | 1|c_type_1| null| # | 1|c_type_2| null| # | 1|c_type_3| r| # | 2|c_type_1| a| # | 2|c_type_2| null| # | 2|

我有一个融化的数据框,看起来像这样:

# +---+--------+----------+
# | id|  c_type|c_type_val|
# +---+--------+----------+
# |  1|c_type_1|      null|
# |  1|c_type_2|      null|
# |  1|c_type_3|         r|
# |  2|c_type_1|         a|
# |  2|c_type_2|      null|
# |  2|c_type_3|      null|
# |  3|c_type_1|      null|
# |  3|c_type_2|      null|
# |  3|c_type_3|      null|
# +---+--------+----------+
我想将行压缩为只有一个值的行,或者对于没有值的行,我想将它们设置为null type和null value,如下所示:

# +---+--------+----------+
# | id|  c_type|c_type_val|
# +---+--------+----------+
# |  1|c_type_3|         r|
# |  2|c_type_1|         a|
# |  3|    null|      null|
# +---+--------+----------+
最初我是这样过滤的,但它会删除id=3的整行:

df.filter(df.c_type_val.isNotNull()).show()

从原始数据框中选择
id
列,删除重复项,然后可以将其与过滤结果左键连接。缺少的id将为其他列的空值

df.select('id').dropDuplicates().join(
    df.filter(df.c_type_val.isNotNull()), ['id'], how='left'
).show()

+---+--------+----------+
| id|  c_type|c_type_val|
+---+--------+----------+
|  1|c_type_3|         r|
|  3|    null|      null|
|  2|c_type_1|         a|
+---+--------+----------+