2016-03-26 63 views
1

我遇到了以下我想在python中解決的問題。我想隨機分配一些具有一定容量的容器。這裏是虛擬的數據幀的例子(與大熊貓),以顯示我想實現什麼:合併數據以在條件下隨機創建新數據

dfA = 
    Car Container Capcity_container Container_type 
0 CAR1  E-1     1    E 
1 CAR1  A-2     2    A 
2 CAR1  B-2     1    B 
3 CAR1  A-6     2    A 
4 CAR2  B-4     1    B 
5 CAR2  A-1     4    A 
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    A 
1 Part2 CAR1    A 
2 Part3 CAR1    B 
3 Part4 CAR1    E 
9 Part10 CAR1    A 
12 Part13 CAR1    A 
4 Part5 CAR2    A 
5 Part6 CAR2    A 
6 Part7 CAR2    A 
13 Part14 CAR2    B 
7 Part8 CAR3    B 
10 Part11 CAR3    B 
11 Part12 CAR3    B 

在DFA,它是已知的汽車包含一個指定容量的容器的時間。

在dfB中,已知哪個部件需要在哪個車廂和哪種類型的集裝箱中。 汽車所有部件的總數與dfA中容器的總和相同。

我的目標:我想將零件隨機分配到正確類型的容器中。之後的容器是「全」部分的其餘部分應分配給用正確的另一個容器type.Ideally它將返回是這樣的:

result =  
       Part Car Container_Type Container_assign 
    0 Part1 CAR1    A    A-2 
    1 Part2 CAR1    A    A-2 
    2 Part3 CAR1    B    B-2 
    3 Part4 CAR1    E    E-1 
    9 Part10 CAR1    A    A-1 
    12 Part13 CAR1    A    A-1 
    4 Part5 CAR2    A    A-1 
    5 Part6 CAR2    A    A-1 
    6 Part7 CAR2    A    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 

請注意,他們可以隨意在容器中分配, 只要滿足容量要求,並且零件位於正確類型的集裝箱和右側汽車/ ULD中。

**編輯#2 ** @Colonel Beauvel:這是你的代碼,稍微調整後,我潛入try函數,這對我來說是全新的。

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 as e: 
     l.append('Not Assigned') 

dfB['Container_assign']=l 

返回此:

 Part CAR Container_Type Container_assign 
0 Part9 CAR2    B    B-4 
1 Part1 CAR1    A    A-2 
2 Part2 CAR1    A    A-2 
3 Part3 CAR1    B    B-2 
4 Part4 CAR1    E    E-1 
5 Part10 CAR1    A  Not Assigned 
6 Part13 CAR1    A  Not Assigned 
7 Part5 CAR2    A    A-1 
8 Part6 CAR2    A    A-1 
9 Part7 CAR2    A    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 

爲了示例的目的,我爲了得到2不assinged份背面改變A-6的容量爲零。有效!

Container CAR Capcity_container Container_type count 
0  E-1 CAR1     1    E  0 
1  A-2 CAR1     2    A  0 
2  B-2 CAR1     1    B  0 
3  A-6 CAR1     0    A  0 
4  B-4 CAR2     1    B  0 
5  A-1 CAR2     4    A  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 

如何使用其他人或最終打印類似「所有部件assinged」的容量,能滿足零件的數量,一切都assinged,換句話說,沒有錯誤?當我添加它時,它會爲每個部分返回。 編輯#3

我覺得這個做的伎倆,很簡單...

l = [] 
dfA['count'] = dfA['Capcity_container'] 
erroryesno = 'All parts are Assinged' 
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 as e: 
     l.append('Not Assigned') 
     erroryesno = 'Some are not assinged' 
print erroryesno 
dfB['Container_assign']=l 
+0

只是爲了讓您知道在您提供的示例中沒有足夠的B型容器容量。 –

+0

嗨Beauvel上校,你是完全正確的,對不起。我製作了這些虛擬數據並編輯它,同時提出了可讀性的問題。我可能在那裏犯了一個錯誤。我編輯它!謝謝你讓我知道! – Uis234

+0

你試過了嗎? –

回答

1

一個可能的解決方案是通過dfB行迭代,並採取dfA第一個可用的相應容器。此容器容量因此減少一個:

l = [] 
dfA['count'] = dfA['Capcity_container'] 

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']) 
    except Exception as e: 
     print 'Not anymore container for this type' 
     raise e 
    dfA.ix[df.index[0],'count'] = dfA.ix[df.index[0],'count'] - 1 

dfB['container_assign']=l 
+0

嗨上校,謝謝,我要試試這個真實的數據。由於數據幀很大,這個例外是一個很好的補充!我會回來的結果! – Uis234

+0

嗨Beavel上校,首先,非常感謝你幫助我!我認爲你提供的解決方案几乎是正確的。在你的代碼中不會有不同的汽車。我試圖讓它在一個將Car列與Container列結合的關鍵字上工作,但這也不起作用。我編輯了虛擬數據,以便您可以看到目前不正確的內容,並將ULD的名稱更改爲Car以使虛擬數據更直觀。任何想法如何完成? – Uis234

+0

我解決了我的問題。這很容易,因爲你只需要在面具中添加汽車過濾...但仍然你的工作示例創建一個錯誤,因爲沒有足夠的容器關於夫妻(汽車,container_type) –