【问题标题】:drop all instances of duplicates in pyspark删除 pyspark 中的所有重复实例
【发布时间】:2020-01-22 05:07:11
【问题描述】:

我尝试搜索这个,但我能找到的最接近的是this。但它并没有给我想要的东西。 我想删除数据框中的所有重复实例。 例如,如果我有一个数据框

   Col1   Col2   Col3
   Alice  Girl   April
   Jean   Boy    Aug
   Jean   Boy    Sept

我想删除 all 基于 Col1 和 Col2 的重复项,以便我得到

  Col1   Col2  Col3
  Alice  Girl  April

有什么办法吗?

另外,如果我有大量这样的列:

   Col1   Col2   Col3  .... Col n
   Alice  Girl   April .... Apple
   Jean   Boy    Aug   .... Orange
   Jean   Boy    Sept  .... Banana

如何仅按 Col1 和 Col2 进行分组,但仍保留其余列?

谢谢

【问题讨论】:

    标签: pyspark pyspark-sql


    【解决方案1】:
    from pyspark.sql import functions as F
    # Sample Dataframe
    df = sqlContext.createDataFrame([
        ["Alice", "Girl","April"],
       ["Jean","Boy", "Aug"],
       ["Jean","Boy","Sept"]
    ], 
        ["Col1","Col2", "Col3"])
    
    # Group by on required column and select rows where count is 1.
    df2 = (df
           .groupBy(["col1", "col2"])
           .agg(
               F.count(F.lit(1)).alias('count'), 
               F.max("col3").alias("col3")).where("count = 1")).drop("count")
    
    df2.show(10, False)
    
    

    输出:

    +-----+----+-----+
    |col1 |col2|col3 |
    +-----+----+-----+
    |Alice|Girl|April|
    +-----+----+-----+
    

    对修改后的版本的回应

    df = sqlContext.createDataFrame([
        ["Alice", "Girl","April", "April"],
        ["Jean","Boy", "Aug", "XYZ"],
        ["Jean","Boy","Sept", "IamBatman"]
    ], 
        ["col1","col2", "col3", "newcol"])
    
    groupingcols = ["col1", "col2"]
    othercolumns = [F.max(col).alias(col) for col in df.columns if col not in groupingcols]
    
    df2 = (df
           .groupBy(groupingcols)
           .agg(F.count(F.lit(1)).alias('count'), *othercolumns)
           .where("count = 1")
           .drop("count"))
    
    df2.show(10, False)
    

    输出:

    +-----+----+-----+------+
    |col1 |col2|col3 |newcol|
    +-----+----+-----+------+
    |Alice|Girl|April|April |
    +-----+----+-----+------+
    

    【讨论】:

    • 感谢您的快速回复!您能解释一下为什么使用 F.max 吗?我不能只按where("count = 1") 过滤吗?
    • 当您应用分组时,您希望在结果 dataframe 中的所有列都必须应用聚合,否则它们将从结果 dataframe 中删除。因此,单个 where 子句将删除 col3。如果那是您想要的,请接受答案。干杯。
    • 谢谢@Sunny Shukla。我已经接受了您的回答,因为公平地说,它回答了我发布的示例中的具体问题。但是,我的实际数据框包含更多列,例如 Col3。有没有办法在分组后保留所有这些列而不聚合所有这些额外的列?我已经相应地更新了我的原始帖子谢谢
    • 更新了另一个响应以概括相同,分组(在某种意义上需要知道计数)并将 max 应用于单个行列将返回相同的值,所以应该没问题。另一种方法是仅分组并获取具有单行的行,然后 inner 加入原始数据集,但这是我们在一次运行中完成的。
    猜你喜欢
    • 2014-10-06
    • 2020-02-02
    • 2019-10-16
    • 2021-11-03
    • 2011-06-17
    • 2021-05-13
    • 2019-09-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多