我有一列包含包裹重量的資料框,現在我必須將它們分配給符合要求的袋子。
我的代碼:
df = pd.DataFrame({'parcel':[a,b,c,d,e],
'weight':[85,60,15,30,150]})
# I have bags that can take 100 kg parcels. Now I want to name the parcels
# that go into a specific bag. The Bags are numbered 1,2,3,4,5. I want to use minimal bags possible.
預期答案:
df =
parcel weight bag_num
0 a 85 1
1 b 60 2
2 c 15 1
3 d 30 2
4 e 150 NaN # This parcel is overweight, cannot be accommodated
我的答案:
df['bag_num'] = df['weight']<100
df['bag_num'].replace(False,np.nan,inplace=True)
df=
parcel weight bag_num
4 e 150 NaN
0 a 85 True
1 b 60 True
3 d 30 True
2 c 15 True
我到了這個地方。我無法繼續?
uj5u.com熱心網友回復:
您可以解決迭代資料幀的行并相應地分配 bag_number 的問題:
import pandas as pd
df = pd.DataFrame(
{"parcel": ["a", "b", "c", "d", "e"], "weight": [85, 60, 15, 30, 150]}
)
MIN_BAG = 1
MAX_BAG = 5
bags_range = range(MIN_BAG, MAX_BAG 1)
# We keep track of the bags and how much weight they hold at any moment
used_bags = {bag_idx: 0 for bag_idx in bags_range}
# Create empty df column
df["bag_num"] = pd.NA
for row in df.itertuples():
parcel_weight = row.weight
if parcel_weight > 100:
continue
for bag in bags_range:
temp_weight = used_bags.get(bag) parcel_weight
if temp_weight <= 100:
used_bags[bag] = temp_weight
df.at[row.Index, "bag_num"] = bag
break
print(df)
這產生了這個結果:
parcel weight bag_num
0 a 85 1
1 b 60 2
2 c 15 1
3 d 30 2
4 e 150 <NA>
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/317947.html
