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

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

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

  1. # Number of rows and columns in the dataset
  2. print((df.count(), len(df.columns)))
  3. (42448764, 9)

在品牌一栏,它有3000多个公司名称。为了分析的目的,我需要减少品牌名称与“其他”排除前20名的品牌。然后它在我的数据框中创建了21个独特的品牌(20个顶级品牌+其他品牌作为剩余品牌)。

  1. current Brand list#
  2. +-----------+------+
  3. | brand| count|
  4. +-----------+------+
  5. | samsung|172896|
  6. | apple|142873|
  7. | null| 58214|
  8. | xiaomi| 56616|
  9. | huawei| 23501|
  10. | lucente| 11578|
  11. | oppo| 10891|
  12. | cordiant| 10551|
  13. | lg| 8727|
  14. | acer| 6882|
  15. | sony| 6729|
  16. | elenberg| 6190|
  17. | artel| 6124|
  18. | triangle| 5835|
  19. | bosch| 5705|
  20. | indesit| 5024|
  21. | nokian| 4907|
  22. | lenovo| 4578|
  23. | philips| 4463|
  24. | vitek| 4107|
  25. | redmond| 4003|
  26. | beko| 3961|
  27. | hp| 3596|
  28. | dauscher| 3531|
  29. | tefal| 3353|
  30. | haier| 3072|
  31. | stels| 3043|
  32. | yokohama| 2735|
  33. | casio| 2687|
  34. | polaris| 2593|
  35. | jbl| 2439|
  36. | midea| 2334|
  37. | nokia| 2222|
  38. | viatti| 2154|
  39. | vivo| 2025|
  40. | force| 1957|
  41. | starline| 1954|
  42. | rowenta| 1885|
  43. | respect| 1857|
  44. | asus| 1850|
  45. | pioneer| 1833|
  46. | meizu| 1735|
  47. | matador| 1711|
  48. | kivi| 1584|
  49. | ariston| 1513|
  50. | braun| 1433|
  1. Expected Brands#
  2. +-----------+------+
  3. | samsung|172896|
  4. | apple|142873|
  5. | xiaomi| 56616|
  6. | huawei| 23501|
  7. | lucente| 11578|
  8. | oppo| 10891|
  9. | cordiant| 10551|
  10. | lg| 8727|
  11. | acer| 6882|
  12. | sony| 6729|
  13. | elenberg| 6190|
  14. | artel| 6124|
  15. | triangle| 5835|
  16. | bosch| 5705|
  17. | indesit| 5024|
  18. | nokian| 4907|
  19. | lenovo| 4578|
  20. | philips| 4463|
  21. | vitek| 4107|
  22. | redmond| 4003|
  23. | Others|3XXXXX|

需要使用pyspark来减少数据框中的品牌名称。如何将列中的多个值替换为排除少数值的单个值?

gkl3eglg

gkl3eglg1#

您可以基于计数分配一个行号,然后将Dataframe分成两部分。对于行号<=20的行,保持其原样。剩下的,加一笔。最后,做一个联合所有的结合在一起。

  1. from pyspark.sql import functions as F, Window
  2. df2 = df.withColumn(
  3. 'rn',
  4. F.row_number().over(
  5. Window.orderBy(
  6. F.when(F.col('brand').isNotNull(), F.col('count')).desc()
  7. )
  8. )
  9. )
  10. df3 = df2.filter('rn <= 20').drop('rn').unionAll(
  11. df2.filter('rn > 20').select(F.lit('Others'), F.sum('count'))
  12. )
  13. df3.show(99)
  14. +--------+------+
  15. | brand| count|
  16. +--------+------+
  17. | samsung|172896|
  18. | apple|142873|
  19. | xiaomi| 56616|
  20. | huawei| 23501|
  21. | lucente| 11578|
  22. | oppo| 10891|
  23. |cordiant| 10551|
  24. | lg| 8727|
  25. | acer| 6882|
  26. | sony| 6729|
  27. |elenberg| 6190|
  28. | artel| 6124|
  29. |triangle| 5835|
  30. | bosch| 5705|
  31. | indesit| 5024|
  32. | nokian| 4907|
  33. | lenovo| 4578|
  34. | philips| 4463|
  35. | vitek| 4107|
  36. | redmond| 4003|
  37. | Others|117271|
  38. +--------+------+
展开查看全部

相关问题