如何解决使用柱状 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 操作有用,我试图使这些数据的预处理变得高效,以便基于 Company
或 ProjectID
进行分组操作,在以显示层次结构并突出显示不同方面。此外,如果使用树,它不一定会平衡,因为一些层次结构可能深入到一个叶节点,而另一些层次结构有更多的子节点,但在层次结构级别上停留的很短。
我尝试了 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 举报,一经查实,本站将立刻删除。