将平面数据转换为树
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
几点:
- 我没有发现任何错误,如果你输入错误的数字它会崩溃
- 如果您有循环连接(索引 0 有父级 1,索引 1 有父级 0)它会崩溃
有一个 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
几点:
- 我没有发现任何错误,如果你输入错误的数字它会崩溃
- 如果您有循环连接(索引 0 有父级 1,索引 1 有父级 0)它会崩溃