将平面数据转换为树

Converting flat data into a tree

有一个 table 类型如下:

编号 |标题。 | parent_id

id title. parent_id
245 Fruits 1
4 All 0

其中有几千行,根据分层方案,即所有树的类型,这些是商店中从最一般到最窄的类别。

我需要为每个 id 再添加几列,其中 parent 类别的名称最多为最一般的类别。也就是说,该行中有更多的列: Depth 6: id_title ;深度5parent_id标题; Depth 4 grandparent_id title 等等最一般。

或者,我需要一个代码来创建每个 id 的路径,而不是这么多的列

假设类别 2642 的标题为“小工具”,类别树中的路径为 - 10016->10072->10690->2642。如果我们将此路径中的类别 ID 替换为 headers,我们将得到以下树:

我不知道怎么做...

下次请提供更多的数据,给定的数据不可能形成一条链!

我认为这应该可以满足您的要求:

from io import StringIO

import pandas as pd

# Your data faked
# -1 marks "no parent", if you change this, you have to change the if clause
data_file = StringIO("""id|title|parent_id
0|abc|-1
1|def|0
2|ghi|0
3|jkl|1
4|mno|2
8|pqr|4
""")


def handle_value(search_id: int, df: pd.DataFrame):
    tmp_value = df.loc[search_id]  # Get the element with the given id (your index)
    print(tmp_value["title"], end="")
    if tmp_value["parent_id"] >= 0:
        print(" -> ", end="")
        handle_value(search_id=tmp_value["parent_id"], df=df)
    else:
        print()


# Read your file
table = pd.read_table(data_file, sep="|", index_col="id", dtype={"parent_id": int})

print(table)

handle_value(8, df=table)

输出:

   title  parent_id
id                 
0    abc         -1
1    def          0
2    ghi          0
3    jkl          1
4    mno          2
8    pqr          4
pqr -> mno -> ghi -> abc

几点:

  1. 我没有发现任何错误,如果你输入错误的数字它会崩溃
  2. 如果您有循环连接(索引 0 有父级 1,索引 1 有父级 0)它会崩溃