代码之家  ›  专栏  ›  技术社区  ›  Tibberzz

过滤但保留空行

  •  0
  • Tibberzz  · 技术社区  · 6 年前

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

    # +---+--------+----------+
    # | 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 回复  |  直到 6 年前
        1
  •  1
  •   akuiper    6 年前

    选择 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|
    +---+--------+----------+