如何解决当组中的某行满足条件时,过滤该组中的数据
如果某个组中没有特定的月份(2017年1月1日),我想删除数据中的组(按id col分组)。
+-----+----------+------------------+
| id| month| price|
+-----+----------+------------------+
| abc|2017-01-01| 1.0|<--
| abc|2017-02-01| 1.0|
| abc|2017-03-01|0.9933874274883838|
| abc|2017-04-01|0.9886929385353734|
| abc|2017-05-01|1.0665978253021122|
| abc|2017-06-01|1.0314266473278149|
| bcd|2017-02-01|1.0463297958471622|<-- no entry for 2017-01-01,filter this group out
| bcd|2017-03-01|1.0712818805540645|
| bcd|2017-04-01|0.9622054745273114|
| bcd|2017-05-01|1.0410563146608105|
| bcd|2017-06-01| 1.0|
| cde|2017-01-01| 1.0|<--
| cde|2017-02-01| 0.95786111804302|
| cde|2017-03-01| 0.99786744034189|
| cde|2017-04-01|0.9943516278425732|
| cde|2017-05-01|0.9770065053504754|
| cde|2017-06-01| 1.006149042146841|
+-----+----------+------------------+
我已经使用窗口功能执行此操作,因此正在寻找一种更好的替代方法。因为这似乎是一个简单/常见任务的长解决方法。
df.withColumn('cond',sum(when('month' == '2017-01-01',1)).over(Window.partitionBy('id'))
df.filter(col('cond') > 1)
Expected output:
+-----+----------+------------------+
| id| month| price|
+-----+----------+------------------+
| abc|2017-01-01| 1.0|
| abc|2017-02-01| 1.0|
| abc|2017-03-01|0.9933874274883838|
| abc|2017-04-01|0.9886929385353734|
| abc|2017-05-01|1.0665978253021122|
| abc|2017-06-01|1.0314266473278149|
| cde|2017-01-01| 1.0|
| cde|2017-02-01| 0.95786111804302|
| cde|2017-03-01| 0.99786744034189|
| cde|2017-04-01|0.9943516278425732|
| cde|2017-05-01|0.9770065053504754|
| cde|2017-06-01| 1.006149042146841|
+-----+----------+------------------+
解决方法
我将使用最小值而不是总和。
df = df.withColumn("base_month",F.min("month").over(Window.partitionBy('id'))
df = df.where("base_month = '2017-01-01'").drop("base_month")
编辑:另一种方式!
df = df.withColumn("month_list",F.collect_set("month").over(Window.partitionBy('id'))
df = df.where("array_contains(month_list,'2017-01-01'").drop("month_list")
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。