代码之家  ›  专栏  ›  技术社区  ›  Ashley O

删除与某些行重复的所有行

  •  1
  • Ashley O  · 技术社区  · 6 年前

    我见过一些这样的问题,但对我的情况来说不是一个令人满意的答案。下面是一个示例数据帧:

    +------+-----+----+
    |    id|value|type|
    +------+-----+----+
    |283924|  1.5|   0|
    |283924|  1.5|   1|
    |982384|  3.0|   0|
    |982384|  3.0|   1|
    |892383|  2.0|   0|
    |892383|  2.5|   1|
    +------+-----+----+
    

    我只想通过 "id" "value" 列,然后删除所有实例。

    在这种情况下:

    • 第1行和第2行是重复的(我们再次忽略“type”列)
    • 第3行和第4行是重复的,因此只应保留第5行和第6行:

    结果将是:

    +------+-----+----+
    |    id|value|type|
    +------+-----+----+
    |892383|  2.5|   1|
    |892383|  2.0|   0|
    +------+-----+----+
    

    我试过了

    df.dropDuplicates(subset = ['id', 'value'], keep = False)
    

    但是“keep”特性不在PySpark中(正如在 pandas.DataFrame.drop_duplicates .

    我还能怎么做?

    2 回复  |  直到 6 年前
        1
  •  2
  •   Steven    6 年前

    你可以使用窗口函数

    from pyspark.sql import Window, functions as F
    df.withColumn(
      'fg', 
      F.count("id").over(Window.partitionBy("id", "value"))
    ).where("fg = 1").drop("fg").show()
    
        2
  •  1
  •   pault Tanjin    6 年前

    你可以 groupBy 这个 id type 去数数。然后使用 join 要筛选出数据帧中计数不是1的行,请执行以下操作:

    df.join(
        df.groupBy('id', 'value').count().where('count = 1').drop('count'), on=['id', 'value']
    ).show()
    #+------+-----+----+
    #|    id|value|type|
    #+------+-----+----+
    #|892383|  2.5|   1|
    #|892383|  2.0|   0|
    #+------+-----+----+