@@ -47,8 +47,11 @@ def immediate_food_delivery(delivery: pd.DataFrame) -> pd.DataFrame:
4747 # 即日配達判定(order_date == customer_pref_delivery_date)
4848 is_immediate = (first_orders[' order_date' ] == first_orders[' customer_pref_delivery_date' ])
4949
50- # 割合を計算(パーセンテージ、小数点2桁)
51- percentage = round (100.0 * is_immediate.sum() / len (is_immediate), 2 )
50+ # 割合を計算(パーセンテージ、小数点2桁)
51+ if is_immediate.empty:
52+ percentage = 0.0
53+ else :
54+ percentage = round (100.0 * is_immediate.sum() / len (is_immediate), 2 )
5255
5356 return pd.DataFrame({' immediate_percentage' : [percentage]})
5457```
@@ -62,15 +65,20 @@ def immediate_food_delivery(delivery: pd.DataFrame) -> pd.DataFrame:
6265# Memory 68.14 MB
6366# Beats 52.06%
6467def immediate_food_delivery (delivery : pd.DataFrame) -> pd.DataFrame:
65- # 各顧客内でorder_dateの昇順ランク付け
66- delivery[' rn' ] = delivery.groupby(' customer_id' )[' order_date' ].rank(method = ' first' , ascending = True )
68+ # 各顧客内でorder_dateの昇順ランク付け(元のDataFrameを変更しない)
69+ delivery_with_rank = delivery.assign(
70+ rn = delivery.groupby(' customer_id' )[' order_date' ].rank(method = ' first' , ascending = True )
71+ )
6772
6873 # 最初の注文のみ抽出
69- first_orders = delivery .loc[delivery [' rn' ] == 1 ]
74+ first_orders = delivery_with_rank .loc[delivery_with_rank [' rn' ] == 1 ]
7075
7176 # 即日配達判定と集計
7277 is_immediate = (first_orders[' order_date' ] == first_orders[' customer_pref_delivery_date' ])
73- percentage = round (100.0 * is_immediate.sum() / len (is_immediate), 2 )
78+ if is_immediate.empty:
79+ percentage = 0.0
80+ else :
81+ percentage = round (100.0 * is_immediate.sum() / len (is_immediate), 2 )
7482
7583 return pd.DataFrame({' immediate_percentage' : [percentage]})
7684```
@@ -88,12 +96,17 @@ def immediate_food_delivery(delivery: pd.DataFrame) -> pd.DataFrame:
8896 # 各顧客の最小order_dateを全行に展開
8997 min_order_date = delivery.groupby(' customer_id' )[' order_date' ].transform(' min' )
9098
91- # 最初の注文のみ抽出
92- first_orders = delivery[delivery[' order_date' ] == min_order_date]
99+ # 最初の注文のみ抽出(同じorder_dateが複数ある場合は1行のみ)
100+ first_orders = delivery[delivery[' order_date' ] == min_order_date].drop_duplicates(
101+ subset = [' customer_id' , ' order_date' ]
102+ )
93103
94104 # 即日配達判定と集計
95105 is_immediate = (first_orders[' order_date' ] == first_orders[' customer_pref_delivery_date' ])
96- percentage = round (100.0 * is_immediate.sum() / len (is_immediate), 2 )
106+ if is_immediate.empty:
107+ percentage = 0.0
108+ else :
109+ percentage = round (100.0 * is_immediate.sum() / len (is_immediate), 2 )
97110
98111 return pd.DataFrame({' immediate_percentage' : [percentage]})
99112```
0 commit comments