i have encountered following problem want solve in python. want assign parts randomly containers have capacity. here example dummy data frames (with pandas) show achieve:
dfa = car container capcity_container container_type 0 car1 e-1 1 e 1 car1 a-2 2 2 car1 b-2 1 b 3 car1 a-6 2 4 car2 b-4 1 b 5 car2 a-1 4 6 car2 b-5 1 b 7 car3 c-2 2 c 8 car3 b-8 1 b 9 car3 b-3 2 b dfb = part car container_type 8 part9 car2 b 0 part1 car1 1 part2 car1 2 part3 car1 b 3 part4 car1 e 9 part10 car1 12 part13 car1 4 part5 car2 5 part6 car2 6 part7 car2 13 part14 car2 b 7 part8 car3 b 10 part11 car3 b 11 part12 car3 b
in dfa, known car contains time of containers specified capacity.
in dfb, known part needs in car , type of container. sum of parts car same sum of capacities of containers in dfa.
my goal: 'assign' parts randomly container right type. after container 'full' rest of parts should assigned container right type.ideally return this:
result = part car container_type container_assign 0 part1 car1 a-2 1 part2 car1 a-2 2 part3 car1 b b-2 3 part4 car1 e e-1 9 part10 car1 a-1 12 part13 car1 a-1 4 part5 car2 a-1 5 part6 car2 a-1 6 part7 car2 a-5 8 part9 car2 b b-2 13 part14 car2 b b-5 7 part8 car3 b b-8 10 part11 car3 b b-8 11 part12 car3 b b-3
please note can assigned randomly on containers, as long capacity requirement met , parts in right type of container , right car/uld.
** edit # 2 ** @colonel beauvel: here code little adjustment me after diving try function, totally new me.
for i, r in dfb.iterrows(): mask = (dfa['count']!=0) & (dfa['container_type']==r['container_type']) & (dfa['car']==r['car']) df = dfa[mask] try: l.append(df.iloc[0]['container']) dfa.ix[df.index[0],'count'] = dfa.ix[df.index[0],'count'] - 1 except exception e: l.append('not assigned') dfb['container_assign']=l
returns this:
part car container_type container_assign 0 part9 car2 b b-4 1 part1 car1 a-2 2 part2 car1 a-2 3 part3 car1 b b-2 4 part4 car1 e e-1 5 part10 car1 not assigned 6 part13 car1 not assigned 7 part5 car2 a-1 8 part6 car2 a-1 9 part7 car2 a-1 10 part14 car2 b b-5 11 part8 car3 b b-8 12 part11 car3 b b-3 13 part12 car3 b b-3
for example purposes, changed capacity of a-6 0 in order 2 not assinged parts back. worked!
container car capcity_container container_type count 0 e-1 car1 1 e 0 1 a-2 car1 2 0 2 b-2 car1 1 b 0 3 a-6 car1 0 0 4 b-4 car2 1 b 0 5 a-1 car2 4 1 6 b-5 car2 1 b 0 7 c-2 car3 2 c 2 8 b-8 car3 1 b 0 9 b-3 car3 2 b 0
how use else or print "all parts assinged" capacity meets number of parts , assinged, in other words, no errors? when add it, returns every part. edit #3
i think trick, simple...
l = [] dfa['count'] = dfa['capcity_container'] erroryesno = 'all parts assinged' i, r in dfb.iterrows(): mask = (dfa['count']!=0) & (dfa['container_type']==r['container_type']) & (dfa['car']==r['car']) df = dfa[mask] try: l.append(df.iloc[0]['container']) dfa.ix[df.index[0],'count'] = dfa.ix[df.index[0],'count'] - 1 except exception e: l.append('not assigned') erroryesno = 'some not assinged' print erroryesno dfb['container_assign']=l
one possible solution iterate through dfb
rows , take first corresponding container available in dfa
. container capacity decreased one:
l = [] dfa['count'] = dfa['capcity_container'] i, r in dfb.iterrows(): mask = (dfa['count']!=0) & (dfa['container_type']==r['container_type']) & (dfa['car']==r['car']) df = dfa[mask] try: l.append(df.iloc[0]['container']) except exception e: print 'not anymore container type' raise e dfa.ix[df.index[0],'count'] = dfa.ix[df.index[0],'count'] - 1 dfb['container_assign']=l
Comments
Post a Comment