首页 > 解决方案 > Python Sunburst Chart - 将数据框转换为嵌套列表格式

问题描述

我已经按照下面提到的链接在 Python 中创建旭日图: 如何在 R 或 Python 中制作旭日图?

附上笔记本供参考。

但是,创建图表的函数需要特定格式的数据(按级别嵌套的列表)。例子:

data = [
    ('/', 100, [
        ('home', 70, [
            ('Images', 40, []),
            ('Videos', 20, []),
            ('Documents', 5, []),
        ]),
        ('usr', 15, [
            ('src', 6, [
                ('linux-headers', 4, []),
                ('virtualbox', 1, []),

            ]),
            ('lib', 4, []),
            ('share', 2, []),
            ('bin', 1, []),
            ('local', 1, []),
            ('include', 1, []),
        ]),
    ]),
]
sunburst(data)

对于同一个示例,如果有人在以节点层次结构作为级别的 excel 文件中给我一个决策树输出,有没有办法将此 excel 输出(在下面找到)转换为上面的列表,以便我可以使用给定的函数创建 Sunburst。

Excel 输出:

Level0,Level1,Level2,Level3,Volume
/,,,,15
/,home,Images,,40
/,home,Videos,,20
/,home,Documents,,5
/,home,,,5
/,usr,src,linux-headers,4
/,usr,src,virtualbox,1
/,usr,src,,1
/,usr,lib,,4
/,usr,share,,2
/,usr,bin,,1
/,usr,local,,1
/,usr,include,,1

标签: pythonlistdataframedecision-treesunburst-diagram

解决方案


Nam Nguyen 的回答非常好,但在特定级别只有一条记录的情况下有一个小错误,然后此语句len(dataframe) == 1变为True并且特定级别的一个值不包含在结果中。我已经更新了他的答案以计算这种情况:

def df_to_nested(dataframe, _groupby, level, col):
"""
- dataframe: source data
- _groupby: groupby columns
- level: start from this level (0 by default)
- col: value to aggregate
"""
result = []
if len(dataframe) == 1:        
    try:
        df = dataframe.groupby(_groupby[level])                    
        for key, val in df: # Iterate through groups                
            result.append(tuple([key, val[col].sum(), []]))
    except Exception: # Reached max depth
        pass
else:
    df = dataframe.groupby(_groupby[level])
    level += 1 # Level0 -> Level1 (increase level)
    for key, val in df: # Iterate through groups
        result.append(tuple([key, val[col].sum(), df_to_nested(val, _groupby, level, col)]))
    level -= 1 # Level1 -> Level0 (decrease level)

return result

推荐阅读