Фильтровать, но сохранять пустые строки

У меня есть расплавленный фрейм данных, который выглядит так:

# +---+--------+----------+
# | 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|
# +---+--------+----------+

Я хочу сжать строки только до строк со значением или для тех, у которых нет значения, я бы хотел установить для них нулевой тип и нулевое значение, например:

# +---+--------+----------+
# | 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()

person Tibberzz    schedule 12.06.2018    source источник


Ответы (1)


Выберите столбец 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|
+---+--------+----------+
person Psidom    schedule 12.06.2018