2017-03-04 294 views
2

名單我有類似下面的數據框:比賽列在大熊貓數據幀

id   sub_id   others 
NaN   10    xxx 
10   11    xxx 
10   13    xxx 
10   15    xxx 
11   12    xxx 
11   16    xxx 
13   14    xxx 
15   17    xxx 
12   20    xxx 
16   55    xxx 
16   85    xxx 
14   19    xxx 
14   43    xxx 
17   87    xxx 
17   91    xxx 

說,例如ID == 10是該數據幀的老闆。 我有一個關卡的列表:levels = [a,b,c,d]。在我的級別列表中,a表示老闆,b表示老闆管理的級別,c是b管理的級別等等。

我想要做的是我想查看哪個ID管理sub_id並基於它創建一個新的列,表示sub_id對應的級別。

我希望我的最後數據幀是這樣的:

id   sub_id   others  level 
NaN   10    xxx   a 
10   11    xxx   b 
10   13    xxx   b 
10   15    xxx   b 
11   12    xxx   c 
11   16    xxx   c 
13   14    xxx   c 
15   17    xxx   c 
12   20    xxx   d 
16   55    xxx   d 
16   85    xxx   d 
14   19    xxx   d 
14   43    xxx   d 
17   87    xxx   d 
17   91    xxx   d 

我目前做如下:

pointer_subid = [] 
loop_subid = [] 



data['level'] = np.nan 
boss = data[data.id.isnull()] 
data['level'][(data['id'].isnull())] = 'a' 
pointer_subid.append([boss['sub_id']) 

levels = ['b', 'c', 'd'] 
k=0 
while k < len(levels): 
    for i in range(0, len(pointer_subid)): 
     for j in range(0,len(data)): 
      data['level'][(data['id'][j] == i)] = levels[k] 
      loop_subid.append(data['sub_id'][j]) 
    del pointer_subid 
    pointer_subid = list(loop_subid) 
    del loop_subid 
    loop_subid = [] 
    k = k+1 

我不知道,如果上面這段代碼會工作。它現在一直在運行幾個小時,我不能檢查它是否給我所需的結果。有沒有其他有效的方法來做到這一點?

任何幫助將不勝感激。在此先感謝..

回答

1

你可以做這樣的事情

data['level'] = pd.Series(np.zeros(len(data['id'])), index=data.index) 
levels = ['a', 'b', 'c' ,'d'] 

def findLevel(sub_id, cnt): 
    idVal = data.loc[data['sub_id'] == sub_id]['id'].as_matrix()[0] 
    if idVal == '-1': # Replaced the nan as -1 and -1 is a character here 
     return cnt 
    cnt += 1 
    return findLevel(idVal, cnt) 

for index, row in data.iterrows(): 
    lvl = levels[findLevel(row['sub_id'], 0)] 
    data.loc[index, 'level'] = lvl