2017-01-17 6 views
3

У меня есть таблица, которая выглядит следующим образом:Сделать fullfilled иерархии из данных с уровнями

import pandas as pd 

x = '1233312332344344' 
y = ['Name_' + str(i) for i, _ in enumerate(x)] 

df = pd.DataFrame({'level': list(x), 'names': y}) 

выглядит следующим образом:

level names 
0  1 Name_0 
1  2 Name_1 
2  3 Name_2 
3  3 Name_3 
4  3 Name_4 
5  1 Name_5 
6  2 Name_6 
7  3 Name_7 
8  3 Name_8 
9  2 Name_9 
10  3 Name_10 
11  4 Name_11 
12  4 Name_12 
13  3 Name_13 
14  4 Name_14 
15  4 Name_15 

Есть ли способ reshap это ДФ с пандами, чтобы получить этот результат (на основе столбца уровня)?

1  2  3  4 
Name_0   
Name_0 Name_1  
Name_0 Name_1 Name_2 
Name_0 Name_1 Name_3 
Name_0 Name_1 Name_4 
Name_5   
Name_5 Name_6  
Name_5 Name_6 Name_7 
Name_5 Name_6 Name_8 
Name_5 Name_9  
Name_5 Name_9 Name_10 
Name_5 Name_9 Name_10 Name_11 
Name_5 Name_9 Name_10 Name_12 
Name_5 Name_9 Name_13 
Name_5 Name_9 Name_13 Name_14 
Name_5 Name_9 Name_13 Name_15 

Это король источника df, но со всеми уровнями иерархии, заполненными рядами.

С уважением.

ответ

3
dummies = pd.get_dummies(df.level) 
d = dummies.mask(dummies == 0).bfill(1).eq(1) 
df.set_index('level', append=True).names.unstack().ffill().where(d, '') 

level  1  2  3  4 
0  Name_0       
1  Name_0 Name_1     
2  Name_0 Name_1 Name_2   
3  Name_0 Name_1 Name_3   
4  Name_0 Name_1 Name_4   
5  Name_5       
6  Name_5 Name_6     
7  Name_5 Name_6 Name_7   
8  Name_5 Name_6 Name_8   
9  Name_5 Name_9     
10  Name_5 Name_9 Name_10   
11  Name_5 Name_9 Name_10 Name_11 
12  Name_5 Name_9 Name_10 Name_12 
13  Name_5 Name_9 Name_13   
14  Name_5 Name_9 Name_13 Name_14 
15  Name_5 Name_9 Name_13 Name_15 
+0

У меня не было логики пустых строк. – MYGz

+1

Мои 'set_index' и' unstack' идентичны вашему стержню. Но OP хотел, чтобы строки заполнялись только до тех пор, пока уровень достиг. Таким образом, для строки 9 уровень равен 2, поэтому заполняйте строку до столбца уровня 2. – piRSquared

+0

Ah. Благодарю. Понял. – MYGz