根据上限和下限将值分配给熊猫数据框

时间:2019-04-23 09:27:51

标签: python-3.x pandas

不幸的是,我最近遇到了这个问题,我对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

请注意,我成功实现了PremiumTimeAlan的{​​{1}},这是本例中的最佳情况。

任何帮助或朝正确方向的推动将不胜感激。谢谢!

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