Как заменить несколько значений в столбце на одно значение, исключая несколько значений?

#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|
 -------- ------