比赛列在大熊猫数据帧
问题描述:
名单我有类似下面的数据框:比赛列在大熊猫数据帧
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
我不知道,如果上面这段代码会工作。它现在一直在运行几个小时,我不能检查它是否给我所需的结果。有没有其他有效的方法来做到这一点?
任何帮助将不胜感激。在此先感谢..
答
你可以做这样的事情
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