Фильтровать, но сохранить пустые строки - PullRequest
0 голосов
/ 12 июня 2018

У меня расплавленный фрейм данных, который выглядит следующим образом:

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

1 Ответ

0 голосов
/ 12 июня 2018

Выберите столбец 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|
+---+--------+----------+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...