У меня есть фрейм данных my_df
, который содержит 4 столбца:
+----------------+---------------+--------+---------+
| user_id| domain|isp_flag|frequency|
+----------------+---------------+--------+---------+
| josh| wanadoo.fr| 1| 15|
| josh| random.it| 0| 12|
| samantha| wanadoo.fr| 1| 16|
| bob| eidsiva.net| 1| 5|
| bob| media.net| 0| 1|
| dylan| vodafone.it| 1| 448|
| dylan| somesite.net| 0| 20|
| dylan| yolosite.net| 0| 49|
| dylan| random.it| 0| 3|
| don| vodafone.it| 1| 39|
| don| popsugar.com| 0| 10|
| don| fabio.com| 1| 49|
+----------------+---------------+--------+---------+
Это то, что я планирую сделать -
Найти все user_id
, гдемаксимальная частота domain
с isp_flag=0
имеет частоту, которая составляет менее 25% от максимальной частоты domain
с isp_flag=1
.
Итак, в приведенном выше примере,мой output_df
будет выглядеть так:
+----------------+---------------+--------+---------+
| user_id| domain|isp_flag|frequency|
+----------------+---------------+--------+---------+
| bob| eidsiva.net| 1| 5|
| bob| media.net| 0| 1|
| dylan| vodafone.it| 1| 448|
| dylan| yolosite.net| 0| 49|
| don| fabio.com| 1| 49|
| don| popsugar.com| 0| 10|
+----------------+---------------+--------+---------+
Я считаю, что для этого мне нужны оконные функции, и поэтому я попробовал следующее, чтобы сначала найти максимальные частотные области для isp_flag=0
и isp_flag=1
соответственно,для каждого из user_id
-
>>> win_1 = Window().partitionBy("user_id", "domain", "isp_flag").orderBy((col("frequency").desc()))
>>> final_df = my_df.select("*", rank().over(win_1).alias("rank")).filter(col("rank")==1)
>>> final_df.show(5) # this just gives me the original dataframe back
Что я здесь не так делаю? Как мне добраться до финала output_df
, который я напечатал выше?