【问题标题】:Pyspark: Delete rows on column condition after groupByPyspark:在groupBy之后删除列条件上的行
【发布时间】:2018-09-06 06:47:09
【问题描述】:

这是我的输入数据框:

id val    
1  Y
1  N
2  a
2  b
3  N

结果应该是:

id val    
1  Y     
2  a    
2  b
3  N

我想在 val 中同时包含 Y 和 N 的 col id 上进行分组,然后删除列 val 包含“N”的行。 请帮我解决这个问题,因为我是 pyspark 的初学者

【问题讨论】:

  • 您在数据帧上运行了哪些转换?你能给我们更多的背景信息吗?
  • 我想按 col id 分组,然后删除列 val 包含“N”的行
  • 为什么不用过滤器直接删除那些行呢?为什么需要分组?
  • 我只想在特定 id 同时具有 val Y 和 N 时删除该行。如果 id 3 只有 val "N" 那么它不应该删除 id 为 3 的行
  • 在包含 100 万条记录的数据框中可以有这么多 2 行或多行的 id。那么在这种情况下您将如何应用过滤条件?

标签: pyspark apache-spark-sql


【解决方案1】:

您可以首先使用val=="Y" 的过滤器识别有问题的行,然后将此数据框连接回原始数据框。最后,您可以过滤 Null 值和要保留的行,例如val==Y。即使有很多行,Pyspark 也应该能够处理自联接。 示例如下:

df_new = spark.createDataFrame([
(1, "Y"), (1, "N"), (1,"X"), (1,"Z"),
(2,"a"), (2,"b"), (3,"N")
], ("id", "val"))

df_Y = df_new.filter(col("val")=="Y").withColumnRenamed("val","val_Y").withColumnRenamed("id","id_Y")
df_new = df_new.join(df_Y, df_new["id"]==df_Y["id_Y"],how="left")
df_new.filter((col("val_Y").isNull()) | ((col("val_Y")=="Y") & ~(col("val")=="N"))).select("id","val").show()

结果将是您的首选:

+---+---+
| id|val|
+---+---+
|  1|  X|
|  1|  Y|
|  1|  Z|
|  3|  N|
|  2|  a|
|  2|  b|
+---+---+

【讨论】:

  • 非常感谢您的解决方案,但如果同一个 id 有两个以上的值,它就不起作用。例如,如果 id 1 有四个值 (Y,N,X,Z) df_new = spark.createDataFrame([ (1, "Y"), (1, "N"), (1,"X"), (1 ,"Z"), (3,"N") ], ("id", "val"))
  • 您好,在这种情况下您可以只更新过滤器:最后一部分不是val == "Y",而是val != "N" 我会更新答案
猜你喜欢
  • 2022-01-10
  • 2016-02-04
  • 2022-01-20
  • 2020-11-26
  • 1970-01-01
  • 2013-05-30
  • 1970-01-01
  • 2021-04-15
  • 1970-01-01
相关资源
最近更新 更多