如何获得地图/dict列中每个项目的总计数百分比?

发布于 2025-02-11 13:19:43 字数 1417 浏览 2 评论 0 原文

我有一个看起来像这样的pyspark dataframe,我有一个地图数据类型列映射< str,int>

 Date              Item (Map<Str,int>)                           Total Items   

2021-02-01    Item_A -> 3, Item_B -> 10, Item_C -> 2                 15
2021-02-02    Item_A -> 1, Item_B -> 5, Item_C ->  7                 13
2021-02-03    Item_A -> 8, Item_B -> 3, Item_C ->  1                 12

我想创建一个新列,该列为我从项目总数中获得的单个项目优势百分比。 item_a /项目总数等所有其他项目。 最终的列也应该是地图。

我想要这样的东西:

 Date              Item (Map<Str,int>)                    Total Items     Item count % 
                                                                        (item/total items)*100

2021-02-01    Item_A -> 3, Item_B -> 10, Item_C -> 5           15     Item_A -> 20%, Item_B -> 66%, Item_c -> 33%
2021-02-02    Item_A -> 1, Item_B -> 5, Item_C ->  7           13    Item_A -> 7%, Item_B -> 38%, Item_C -> 53%
2021-02-03    Item_A -> 8, Item_B -> 3, Item_C ->  1           12    Item_A -> 66%, Item_B -> 25%, Item_C -> 8.3%

我的方法:

df = df.withColumn('Item_count_percentage', F.expr('aggregate(map_values(Item), 0 , (acc, x) -> (acc / int(x)/100)'))
df.show(truncate=False)

I have a PySpark dataframe which looks like this, I have a map datatype column Map<Str,Int>

 Date              Item (Map<Str,int>)                           Total Items   

2021-02-01    Item_A -> 3, Item_B -> 10, Item_C -> 2                 15
2021-02-02    Item_A -> 1, Item_B -> 5, Item_C ->  7                 13
2021-02-03    Item_A -> 8, Item_B -> 3, Item_C ->  1                 12

I want to create a new column which gives me the individual Item dominance percentage from the total number of items. Item_A / total number of items and so on to all other items.
The resulting column should also be a map.

I want something like this:

 Date              Item (Map<Str,int>)                    Total Items     Item count % 
                                                                        (item/total items)*100

2021-02-01    Item_A -> 3, Item_B -> 10, Item_C -> 5           15     Item_A -> 20%, Item_B -> 66%, Item_c -> 33%
2021-02-02    Item_A -> 1, Item_B -> 5, Item_C ->  7           13    Item_A -> 7%, Item_B -> 38%, Item_C -> 53%
2021-02-03    Item_A -> 8, Item_B -> 3, Item_C ->  1           12    Item_A -> 66%, Item_B -> 25%, Item_C -> 8.3%

My approach:

df = df.withColumn('Item_count_percentage', F.expr('aggregate(map_values(Item), 0 , (acc, x) -> (acc / int(x)/100)'))
df.show(truncate=False)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

挽清梦 2025-02-18 13:19:43
  • Spark 3.0+

    Making use of transform_values

    from pyspark.sql import functions as F
    
    df = df.withColumn(
        'Item count',
        F.expr("transform_values(Item, (k, v) -> round(v / `Total Items` * 100, 1))")
    )
    
  • Spark 2.4+

    Recreating the map (map_from_arrays) by first extracting keys (map_keys), then values (map_values) and applying a higher order function (transform) on values.

    from pyspark.sql import functions as F
    
    df = df.withColumn(
        'Item count',
        F.map_from_arrays(
            F.map_keys('Item'),
            F.expr("transform(map_values(Item), x -> round(x / `Total Items` * 100, 1))")
        )
    )
    
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文