【问题标题】:Work with a columnar Pandas dataframe data format to generate a hierarchical tree structure使用柱状 Pandas 数据框数据格式生成分层树结构
【发布时间】:2021-03-05 22:45:43
【问题描述】:

我正在尝试找出一种好方法,在从 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() 操作以将它们融合在一起,但这并不是最好的方法,因为每个进程级别有两列(即ProcessLevelXXProcessXXName)是在单独的列中,我想将它们放在一起以用于层次结构。是否有a)Pandas中的一种有效算法,用于处理分布在多列中的这些类型的分层数据,并且通过智能Pandas操作我可以映射这些关系,或者b)我可以用来有效计算和执行的数据结构或算法groupby 的?这是一个值得关注的领域,因为通过数据抽象,树数据结构的有效重新排列(这是我正在考虑的,因为数据本质上是分层的)将非常低效。但是,我不知道如何构建一个高效、优雅的范例来做到这一点。如果这些数据在数据库中可用,那将是理想的,但这里不是这种情况(只是在 Excel 中以这种格式给出)。

【问题讨论】:

    标签: python pandas algorithm dataframe data-structures


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 感谢您的提示。我只是想想想这个分层数据是否会减慢 companyName、projectName 和一些不同类型的 groupby 操作的任何类型的重新排列或过滤(例如,groupby)。只是“抽象”并为 groupby 操作创建其他有效的树突出显示方法会更好吗?
    • @qxzsilver:我不认为它会很慢。我无法回答其他一些抽象对于您的用例来说是好是坏。
    猜你喜欢
    • 2023-04-02
    • 2019-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-14
    • 1970-01-01
    • 2011-11-24
    相关资源
    最近更新 更多