กรองแต่คงแถวว่างไว้

ฉันมี dataframe ที่หลอมละลายซึ่งมีลักษณะดังนี้:

# +---+--------+----------+
# | 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 และค่า 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 จากกรอบข้อมูลดั้งเดิม ลบรายการที่ซ้ำกัน จากนั้นคุณสามารถรวมคอลัมน์นั้นเข้ากับผลลัพธ์ที่กรองได้ ซึ่ง 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