我有2個資料幀,如下所示
Dataframe1 (df_address) - Has 2 columns => user_id 和 address_id (所有地址 對于一個用戶)
Dataframe2 (df_orders) - 擁有3列=> user_id, address_id, order_id (user_id 是外鍵)
有一點需要注意的是,df_address表包含了一些地址,這些地址在df_orders表中是不的
我需要找到與每個(user_id,address_id)對相關的order_share,它是由
計算的。count unique pairs (user_id, address_id) / (address_count based on user_id) * 100
為此,我做了以下作業
。
df1 = df_address.groupBy('customer_id').count().select('customer_id',(f. col('count')).alias('address_counts') # 得到每個用戶的總地址數。
df2 = df_orders.groupBy('customer_id','address_id').count()。 select('customer_id','address_id',f.col('count').alias('order_count') # get count of each order in `df_orders'.
df = df1.join(df2, "customer_id"/span>, how='inner'/span>)
def get_order_share(order_count,address_counts)。
return (order_count/address_counts)*100。
udf_func = udf(get_order_share,FloatType() )
df = df.withColumn("order_share",udf_func(df.order_count,df.address_counts) ) #從總數中獲得百分比。
df的o/p是
|customer_id|address_counts|address_id|order_count|order_share||
| 1| 6| 102| 2| 33.333332|
| 1| 6| 100| 4| 66.66664|
| 1| 6| 103| 1| 16.666666|
| 1| 6| 101| 1| 16.666667|
| 3| 3| 300| 2| 66.6664|
但是,對于不在df_orders資料框架中的id,我想把它們也包括在結果中,并把order_count和order_share定為0。我不確定如何去做,在哪一步需要這樣做
如果有任何幫助,我將不勝感激。謝謝!
編輯1--添加樣本資料
columns1 = ['customer_id','address_id','order_id']
data1 = [
(1,100,733) 。 (1,100,8389) 。 (1,100,894) 。 (1,100,653) 。 (1,101,649) 。 (1,102,6493) 。 (1,102,6449) 。 (1,103,749) 。
(2,200,648), (2,200, 545),(2,201,8384) 。
(3,300,8392) 。 (3,300,7294) 。 (3,301,828) 。 (3,301,9204) 。
]
columns2 = ['customer_id','address_id']
data2 = [
(1,100),(1, 101),(1,102) 。 (1,103),(1, 104),(1,105) 。
(2,200), (2, 201),(2,202) 。
(3,300), (3, 301),(3,302) 。
]
df_orders = spark.createDataFrame(data1, columns1)
df_address = spark.createDataFrame(data2, columns2)
# Notice addresses 104,105,202 and 302 are missing from `df_orders`.
uj5u.com熱心網友回復:
你可以繼續通過左鍵連接新的df在你現有的df_address上,并將空值填為0
df = df_address. join(df,['customer_id','address_id'],'left') .na.fill(0)
df.show()
----------- ---------- -------------- ----------- -----------
|customer_id|address_id|address_counts|order_count|order_share|
----------- ---------- -------------- ----------- -----------
| 2| 200| 3| 2| 66.66664|
| 3| 300| 3| 2| 66.6664|
| 3| 301| 3| 2| 66.6664|
| 1| 102| 6| 2| 33.333332|
| 3| 302| 0| 0| 0.0|
| 1| 104| 0| 0| 0.0|
| 1| 105| 0| 0| 0.0|
| 2| 201| 3| 1| 33.333332|
| 1| 100| 6| 4| 66.66664|
| 1| 103| 6| 1| 16.666666|
| 1| 101| 6| 1| 16.666667|
| 2| 202| 0| 0| 0.0|
----------- ---------- -------------- ----------- -----------
讓我知道這是否對你有用。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/310749.html
標籤:
