如何将列中的多个值替换为单个值(不包括少数值)

cgvd09ve  于 2021-07-13  发布在  Spark
关注(0)|答案(1)|浏览(303)

我的数据框有超过4200万条记录。


# Number of rows and columns in the dataset

print((df.count(), len(df.columns)))

(42448764, 9)

在品牌一栏,它有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来减少数据框中的品牌名称。如何将列中的多个值替换为排除少数值的单个值?

gkl3eglg

gkl3eglg1#

您可以基于计数分配一个行号,然后将Dataframe分成两部分。对于行号<=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|
+--------+------+

相关问题