私は最近この問題に遭遇しましたが、残念ながら、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
このシナリオでは、各トランスポートモードは1つのクライアントにのみ割り当てることができ、を想定していlen(df1) == len(df2)
ます。ここで私が達成しようとしているのは、すべてのクライアントに1つのトランスポートモードを割り当てて、クライアントを超えないよう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
とDonald
、この例では最良のシナリオです。
どんな助けでも、または正しい方向に微調整することは大いにありがたいです。ありがとう!
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
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加