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

Python 删除与某些行重复的所有行,python,pyspark,apache-spark-sql,pyspark-sql,Python,Pyspark,Apache Spark Sql,Pyspark Sql,我见过几个这样的问题,但对我的情况来说不是一个令人满意的答案。以下是一个示例数据帧: +------+-----+----+ | 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|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)
但是PySpark中并没有“保留”功能(就像在中一样)


我还能怎么做呢?

您可以
groupBy
通过
id
type
获取计数。然后使用
join
筛选出数据帧中计数不为1的行:

df.join(
df.groupBy('id','value').count()。其中('count=1')。drop('count'),on=['id','value']
).show()
#+------+-----+----+
#|id |值|类型|
#+------+-----+----+
#|892383|  2.5|   1|
#|892383|  2.0|   0|
#+------+-----+----+

您可以使用窗口功能执行此操作

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

我原以为这与我的答案相同,但执行计划却相反。当我这样做时,我仍然得到原始行数。没有变化当我这样做时,我仍然得到原始行数。没有变化这个答案和@Steven的下面对我都有效。你能创建一个显示你的问题的数据框吗?对不起,我创建了一个新的数据框并使用了你们的解决方案都奏效了。看来我的原始数据已被另一方扩充,而数据未按预期进行重复数据消除是因为数据不再相同。这是我的错。