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

2024-09-27 07:26:00 发布

您现在位置:Python中文网/ 问答频道 /正文

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

+------+-----+----+
|    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中(就像在^{}中一样)。你知道吗

我还能怎么做?你知道吗


Tags: 数据实例答案idfalse示例dfvalue
2条回答

您可以使用窗口函数来实现这一点

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()

您可以groupByidtype来获取计数。然后使用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|
#+   +  -+  +

相关问题 更多 >

    热门问题