从具有层级的数据中创建满足要求的层级结构

3

我有一个表格,看起来像这样:

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   

有没有一种方法可以使用pandas重塑此数据框,以获得基于level列的以下结果?

  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

这是一种具有所有层级填充在行中的源数据框。
1个回答

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

我没有完全理解空行的逻辑。 - Mohammad Yusuf
1
我的 set_indexunstack 与你的 pivot 完全相同。但是 OP 只希望填充到每个级别结束的位置。因此,对于第9行,级别为2,所以只需要填充到级别为2的列。 - piRSquared
啊,谢谢。明白了。 - Mohammad Yusuf
非常感谢!这是一个非常有趣的解决方案。 - Alexey Trofimov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接