#apache-spark #pyspark
#apache-искра #пайспарк
Вопрос:
Мой фрейм данных содержит более 42 миллионов записей.
# Number of rows and columns in the dataset
print((df.count(), len(df.columns)))
(42448764, 9)
В столбце Brand указано более 3000 названий компаний. Для целей аналитики мне нужно сократить название бренда на «другие», исключая топ-20 брендов. Затем он создает 21 уникальный бренд в моем фрейме данных (20 лучших брендов «Другие» в качестве оставшегося бренда.
current Brand list#
----------- ------
| brand| count|
----------- ------
| samsung|172896|
| apple|142873|
| null| 58214|
| xiaomi| 56616|
| huawei| 23501|
| lucente| 11578|
| oppo| 10891|
| cordiant| 10551|
| lg| 8727|
| acer| 6882|
| sony| 6729|
| elenberg| 6190|
| artel| 6124|
| triangle| 5835|
| bosch| 5705|
| indesit| 5024|
| nokian| 4907|
| lenovo| 4578|
| philips| 4463|
| vitek| 4107|
| redmond| 4003|
| beko| 3961|
| hp| 3596|
| dauscher| 3531|
| tefal| 3353|
| haier| 3072|
| stels| 3043|
| yokohama| 2735|
| casio| 2687|
| polaris| 2593|
| jbl| 2439|
| midea| 2334|
| nokia| 2222|
| viatti| 2154|
| vivo| 2025|
| force| 1957|
| starline| 1954|
| rowenta| 1885|
| respect| 1857|
| asus| 1850|
| pioneer| 1833|
| meizu| 1735|
| matador| 1711|
| kivi| 1584|
| ariston| 1513|
| braun| 1433|
Expected Brands#
----------- ------
| samsung|172896|
| apple|142873|
| xiaomi| 56616|
| huawei| 23501|
| lucente| 11578|
| oppo| 10891|
| cordiant| 10551|
| lg| 8727|
| acer| 6882|
| sony| 6729|
| elenberg| 6190|
| artel| 6124|
| triangle| 5835|
| bosch| 5705|
| indesit| 5024|
| nokian| 4907|
| lenovo| 4578|
| philips| 4463|
| vitek| 4107|
| redmond| 4003|
| Others|3XXXXX|
Необходимо использовать Pyspark для уменьшения количества названий брендов во фрейме данных. Как заменить несколько значений в столбце на одно значение, исключая несколько значений?
Ответ №1:
Вы можете присвоить номер строки на основе количества, а затем разделить фрейм данных на две части. Для номера строки <= 20 сохраните строки такими, какие они есть. В остальном суммируйте сумму. Наконец, выполните объединение всех, чтобы объединить их вместе.
from pyspark.sql import functions as F, Window
df2 = df.withColumn(
'rn',
F.row_number().over(
Window.orderBy(
F.when(F.col('brand').isNotNull(), F.col('count')).desc()
)
)
)
df3 = df2.filter('rn <= 20').drop('rn').unionAll(
df2.filter('rn > 20').select(F.lit('Others'), F.sum('count'))
)
df3.show(99)
-------- ------
| brand| count|
-------- ------
| samsung|172896|
| apple|142873|
| xiaomi| 56616|
| huawei| 23501|
| lucente| 11578|
| oppo| 10891|
|cordiant| 10551|
| lg| 8727|
| acer| 6882|
| sony| 6729|
|elenberg| 6190|
| artel| 6124|
|triangle| 5835|
| bosch| 5705|
| indesit| 5024|
| nokian| 4907|
| lenovo| 4578|
| philips| 4463|
| vitek| 4107|
| redmond| 4003|
| Others|117271|
-------- ------