pyspark - Pyspark 根据其他列中的字符串值删除重复项
问题描述
我在下面有这个数据框:
+--------+----------+----------+
|SID |Date |Attribute |
+--------+----------+----------+
|1001 |2021-01-01|Y |
|1001 |2021-05-31|N |
|1001 |2021-05-15|N |
|1002 |2021-05-31|N |
|1002 |2021-04-06|N |
|1003 |2021-01-01|Y |
|1003 |2021-02-01|N |
|1004 |2021-03-30|N |
+--------+----------+----------+
我试图得到如下结果。
+--------+----------+----------+
|SID |Date |Attribute |
+--------+----------+----------+
|1001 |2021-01-01|Y |
|1002 |2021-05-31|N |
|1002 |2021-04-06|N |
|1003 |2021-01-01|Y |
|1004 |2021-03-30|N |
+--------+----------+----------+
我想在重复的一行中排除该记录SID
,Y
但Attribute
如果SID
仅N
在Attribute
.
我认为带有过滤器的窗口分区可以提供帮助,但我不确定如何在我提到的条件下做到这一点。有什么方法可以在 Pyspark 中实现吗?我看到了一个类似的帖子,但它是针对 Scala SQL 而不是针对 Pyspark。
解决方案
from pyspark.sql import Window
import pyspark.sql.functions as F
#Create a window of each group ordered by Date and containing all elements in a specified column h=Window.partitionBy('SID').orderBy('Date').rowsBetween(Window.unboundedPreceding, Window.unboundedFollowing)
(
df.withColumn('filt', F.first('Attribute').over(h))# Create a column in which you broadcast first Attribute value in each SID
.filter(F.col('Attribute')==F.col('filt')).drop('filt')#After broadcast, filter where Attribute value equals to the new columns value and drop the new column
).show()
+----+----------+---------+
| SID| Date|Attribute|
+----+----------+---------+
|1001|2021-01-01| Y|
|1002|2021-04-06| N|
|1002|2021-05-31| N|
|1003|2021-01-01| Y|
|1004|2021-03-30| N|
+----+----------+---------+
推荐阅读
- python - Pyserial readline() 并等到收到一个值才能继续
- c - 如何将 while 中的 if-else 语句放在 for 循环中?
- php - 如何检查文件是否包含多次
- sql - SAS中的proc sql代码没有正确过滤
- javascript - 如何在 Vue 3 (Vue Router) 中设置具有多个动态参数的动态路由
- python - 如何从 Python 中导入模块
- discord.py - Discord.py 机器人增强消息
- python - 在目录中的 ImageDataGenerator 流中将两个类视为一个类
- python - Flask html字符串包含标签,但在浏览器中不起作用
- javascript - Chrome 扩展:将脚本注入单个网页(由用户提供)