我看到了这样的几个问题,但对我的情况却不是令人满意的答案。这是一个示例DataFrame:
+------+-----+----+
| 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"
列来识别重复项,然后删除所有实例。
在这种情况下:
输出为:
+------+-----+----+
| id|value|type|
+------+-----+----+
|892383| 2.5| 1|
|892383| 2.0| 0|
+------+-----+----+
我尝试过
df.dropDuplicates(subset = ['id', 'value'], keep = False)
但是PySpark中没有“保持”功能(pandas.DataFrame.drop_duplicates
中没有。
我还能怎么做?
答案 0 :(得分: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()
答案 1 :(得分:1)
您可以groupBy
,id
和type
来获取计数。然后使用join
过滤掉DataFrame中计数不是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|
#+------+-----+----+