2017-03-04 295 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