我正尝试使用Pandas库将一个使用固定列数(许多列为空)的列格式的层次结构转换为一个具有子级和父级的邻接列表。
层次结构示例
下面是一个具有5个层次级别的虚构示例:
Books
/ | \
Science (null) (null)
/ | \
Astronomy (null) Pictures
/ \ | \
Astrophysics Cosmology (null) Astronomy
/ \ | / | \
(null) (null) Amateurs_Astronomy Galaxies Stars Astronauts
数据.csv
id,level_1,level_2,level_3,level_4,level_5
1,Books,Science,Astronomy,Astrophysics,
2,Books,Science,Astronomy,Cosmology,
3,Books,,,,Amateurs_Astronomy
4,Books,,Pictures,Astronomy,Galaxies
5,Books,,Pictures,Astronomy,Stars
6,Books,,Pictures,Astronomy,Astronauts
我所做的一切
我首先添加了一个列,用于存储每个现有节点的uuid。
[EDIT,根据mozway的评论]
这个函数的问题是,它将为相同的节点填充不同的uuid:
- 第一行和第二行具有相同的级别1、2、3,因此应该具有与pk_level_3相同的uuid
- 以相同的方式,行4、5和6应该具有与pk_level_3和pk_level_4相同的uuid。
import pandas as pd
df = pd.read_csv('data.csv')
# iterate over each column in the dataframe to add a new column,
# containing a uuid each time the csv row has a value for this level:
for col in df.columns:
if df[col].isnull().sum() > 0:
new_col = 'pk_' + col
df[new_col] = None
# fill the new column with uuid only for non-null values of the original column
df.loc[df[col].notnull(), new_col] = df.loc[df[col].notnull(), col].apply(lambda x: uuid.uuid4())
此外,我不知道如何找到每个节点的父节点,跳过所有空节点。
你知道我怎样才能得到下面的结果吗?
this_node,parent_node,this_node_uuid,parent_node_uuid
Science,Books,books/science-node-uuid,books-node-uuid
Astronomy,Science,books/science/astronomy-node-uuid,books/science-node-uuid
Astrophysics,Astronomy,books/science/astronomy/astrophysics-node-uuid,books/science/astronomy-node-uuid
Amateurs_Astronomy,Books,books/amateurs_astronomy-node-uuid,books-node-uuid
(...)
3条答案
按热度按时间qfe3c7zg1#
下面是一种按值和级别生成uuid,然后生成邻接列表的方法:
输出:
图表
kuhbmx9i2#
在这里,您如何生成uuid?
输出:
64jmpszr3#