【问题标题】:Make fulfilled hierarchy from data with levels从具有级别的数据中创建满足的层次结构
【发布时间】:2017-06-01 14:56:52
【问题描述】:

我有一个如下所示的表格:

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 重塑这个 df,以获得这个结果(基于 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

这是一种源 df,但所有层次结构级别都填充在行中。

【问题讨论】:

    标签: python pandas hierarchy reshape


    【解决方案1】:
    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
    

    【讨论】:

    • 我不太明白空行的逻辑。
    • 我的 set_indexunstack 与您的数据中心相同。但是 OP 只希望在级别达到的范围内填写行。因此,对于第 9 行,级别为 2,因此仅将行填充到级别 2 的列。
    • 啊。谢谢。明白了。
    • 非常感谢!非常有趣的解决方案。
    猜你喜欢
    • 2013-11-07
    • 2014-12-08
    • 2019-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-07
    • 1970-01-01
    • 2012-12-17
    相关资源
    最近更新 更多