python - Combine data to create new data randomly on conditions -


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