#python #sql #apache-spark #pyspark
#python #sql #apache-spark #pyspark
Вопрос:
У меня есть фрейм данных с идентификатором продукта, именем и весом. Я надеюсь рассчитать процент продуктов, которые весили от 10-20, а также 50-60. Я могу придумать наивный способ, который заключается в подсчете всех строк и подсчете, что строки имеют вес 10-20, а также 50-60 и выполняют деление. Что было бы лучшим способом сделать это? Можем ли мы использовать некоторые встроенные функции? Большое спасибо за вашу помощь.
id. name. weight
1. a. 11
2. b 15
3. c 26
4. d. 51
5. e. 70
Ответ №1:
Вы можете использовать F.avg
, чтобы получить процент от того, находится ли столбец weight
между заданным интервалом. .cast('int')
возвращает 1, если сравнение верно, иначе 0. Его средним значением будет процент, который вы хотели вычислить.
import pyspark.sql.functions as F
df2 = df.select(
F.avg(F.col('weight').between(10,20).cast('int')).alias('10_20'),
F.avg(F.col('weight').between(50,60).cast('int')).alias('50_60')
)
df2.show()
----- -----
|10_20|50_60|
----- -----
| 0.4| 0.2|
----- -----
Комментарии:
1. Спасибо! где я могу найти документ для этого? например, я не знал
between
2. Смотрите здесь
Ответ №2:
Похоже, вам нужна условная агрегация:
select avg(case when weight between 10 and 20 then 1.0 else 0 end) as ratio_10_20,
avg(case when weight between 50 and 60 then 1.0 else 0 end) as ratio_50_60
from t;