微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用柱状 Pandas 数据帧数据格式生成分层树结构

如何解决使用柱状 Pandas 数据帧数据格式生成分层树结构

我正在尝试找出一种在从 excel 文件获取的 Pandas 中创建以下数据框抽象的好方法

Date | ID   | Company  | ProjectID | ProjectName     | ProcessLevel1 | Process1Name     | ProcessLevel2 | Process2Name    | ProcessLevel3 | Process3Name | ProcessLevel4 | Process4Name | ...
2020 | 1234 | ABCCorp. | XYZ123    | SomeProjectName |       P1      | Data Preparation |               |                 |               |              |               |              | ...
2020 | 1234 | ABCCorp. | XYZ123    | SomeProjectName |       P1      | Data Preparation |       P2      | Data Extraction |               |              |               |              | ...
2020 | 1234 | ABCCorp. | XYZ123    | SomeProjectName |       P1      | Data Preparation |       P2      | Data Cleansing  |               |              |               |              | ...

级别是分层的,我想创建一个不同级别的项目流程链接显示其前一个级别以及它之前的级别。如上所示,进程有多个级别作为名称和级别,其中 L1 是最高级别(第一步)。一些步骤是并发完成的,并且有流程跟随它并分支为具有潜在子流程的多个并行流程。本质上,这是一个树状层次结构,包含 P1 级、P2 级、P3 级等大约 30 个级别。

本质上,它看起来像

P1                          Data Preparation
                           /                 \
P2                  Data Extraction        Data Cleansing
                   /         |            /     |   \     \
P3            Categorical Numerical     Strip Split Null  Remove

我正在尝试创建一个数据抽象来绘制它,进行各种计算(即,从特定流程节点产生多少子流程,P3 级别中有多少流程,给定某个节点的流程层次结构是什么在这个进程树中,等等)。我不认为在这里做 Pandas 操作有用,我试图使这些数据的预处理变得高效,以便基于 CompanyProjectID 进行分组操作,在以显示层次结构并突出显示不同方面。此外,如果使用树,它不一定会平衡,因为一些层次结构可能深入到一个叶节点,而另一些层次结构有更多的子节点,但在层次结构级别上停留的很短。

我尝试了 pd.melt() 操作以将它们融合在一起,但这并不是处理它的最佳方法,因为每个流程级别都有两列(即 ProcessLevelXX 和 { {1}}) 位于单独的列中,为了层次结构的目的,我想将它们放在一起。是否有 a) Pandas 中的有效算法来处理分布在多列中的这些类型的分层数据,并且通过智能 Pandas 操作我可以映射这些关系,或者 b) 我可以用来高效计算和执行的数据结构或算法ProcessXXName 的?这是一个值得关注的领域,因为对于数据抽象,树数据结构的有效重新排列(这是我正在考虑的,因为数据本质上是分层的)将非常低效。但是,我不知道如何构建一个高效、优雅的范式来做到这一点。如果这些数据在数据库中可用,那将是理想的,但这里的情况并非如此(仅在 Excel 中以这种格式给出)。

解决方法

Pandas 中的分层索引使用他们所谓的 MultiIndex。

这个想法是,你的索引不是一个单一的系列,而是像它自己的具有多个系列的 DataFrame。对于您的示例数据,MultiIndex 的第一级将命名为 P1,对于所有行,其值为“数据准备”。第二个级别是 P2,有两个值,“数据提取”和“数据清理”。等等。

对于 MultiIndex 的每个级别,任何单独的行都有一个值,因此例如,您可能有一个索引值为 ["Data Preparation","Data Cleansing","Split"] 的行。

文档:https://pandas.pydata.org/pandas-docs/stable/user_guide/advanced.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。