我有一個看起來像這樣的 PySpark 資料框,我有一個地圖資料型別列 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
我想創建一個新列,它為我提供了專案總數中的單個專案優勢百分比。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)
uj5u.com熱心網友回復:
火花 3.0
利用
transform_valuesfrom pyspark.sql import functions as F df = df.withColumn( 'Item count', F.expr("transform_values(Item, (k, v) -> round(v / `Total Items` * 100, 1))") )火花 2.4
map_from_arrays通過首先提取鍵 (map_keys)、值 (map_values) 并對值應用更高階函式 ( ) 來重新創建映射(transform)。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))") ) )
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/496480.html
