Filter tetapi Pertahankan Baris Null

Saya memiliki kerangka data meleleh yang terlihat seperti ini:

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

Saya ingin menyingkat baris menjadi hanya baris dengan nilai atau untuk baris tanpa nilai, saya ingin mengaturnya ke tipe nol dan nilai nol seperti:

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

Awalnya saya memfilter seperti ini, tetapi seluruh baris untuk id=3 hilang:

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

person Tibberzz    schedule 12.06.2018    source sumber


Jawaban (1)


Pilih kolom id dari bingkai data asli, hapus duplikatnya dan kemudian Anda dapat menggabungkannya dengan hasil yang difilter, id yang hilang akan memiliki nilai nol untuk kolom lainnya.

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