不幸的是,我最近遇到了这个问题,我对Python的了解不足以考虑解决方案。
说我是悉尼-墨尔本航线的物流经理,我可以选择以下运输方式,以及该路线各自的旅行时间:
df1 = pd.DataFrame()
Index Transportation Time
1 Plane 1:00:00
2 Rail 3:00:00
3 Truck 5:00:00
4 Bus 7:00:00
5 Ferry 9:00:00
此外,我有一份客户清单,列出了他们希望等待交货的时间以及他们愿意为快速交货支付溢价的特定截止时间。
df2 = pd.DataFrame()
Index Client PremiumTime MaxTime
1 Alan 1:00:00 3:00:00
2 Bernard 2:00:00 5:00:00
3 Cassie 2:00:00 7:00:00
4 Donald 3:00:00 7:00:00
5 Elijah 5:00:00 9:00:00
在这种情况下,每种传输方式只能分配给一个客户端,并假定为len(df1) == len(df2)
。我要在这里实现的目标是为每个客户分配一种传输方式,以使我不超过他们的MaxTime
,同时努力满足尽可能多的客户的PremiumTime
可能。
可能的期望输出样本:
Index Client PremiumTime MaxTime Transportation
1 Alan 1:00:00 3:00:00 Plane
2 Bernard 2:00:00 5:00:00 Truck
3 Cassie 2:00:00 7:00:00 Bus
4 Donald 3:00:00 7:00:00 Rail
5 Elijah 5:00:00 9:00:00 Ferry
请注意,我成功实现了PremiumTime
和Alan
的{{1}},这是本例中的最佳情况。
任何帮助或朝正确方向的推动将不胜感激。谢谢!
答案 0 :(得分:2)
IIUC,使用:
d=df1.set_index('Time')['Transportation']
#create a mapping for time and transport
cond=df2.PremiumTime.isin(df1.Time)
#check if PremiumTime from df2 is there in time in df1
然后使用np.where()
进行条件映射
df2['Transportation']=np.where(cond,df2.PremiumTime.map(d),df2.MaxTime.map(d))
print(df2)
输出
Client PremiumTime MaxTime Transportation
Index
1 Alan 1:00:00 3:00:00 Plane
2 Bernard 2:00:00 5:00:00 Truck
3 Cassie 2:00:00 7:00:00 Bus
4 Donald 3:00:00 7:00:00 Rail
5 Elijah 5:00:00 9:00:00 Truck #note the diff in this row output