在Panda中构建层次结构



我希望建立一个谁向谁报告的层次结构,并为每个记录创建报告结构。

我的原始数据将由两列组成:e_id和s_id:

我想创建一个带有字典的变量,字典中包含如下结构。列表的最左边的值将是攀爬层次结构,而dictionary键是recordeid值。

e_id    s_id    structure
1                  {1:[null]}
2        3       {2:[2,3]} circular so infinite sequence
3        2       {3:[3,2]} circular so infinite sequence
4        6       {4:[null,1,6]}
5        4       {5:[null,1,6,4]}
6        1       {6:[null,1]}

根据我的理解,这将是一个应用方法,我只是对如何设置它来读取其他行并返回该行的s_id值感到困惑。

提前谢谢!

使用networkx图可能有更好的方法。但这里有一个简单的解决方案。

df = pd.DataFrame({'e_id': [1,2,3,4,5,6],
's_id': [None,3,2,6,4,1]})

创建带有父母和子女的dict

parents = dict(zip(df.e_id, df.s_id))

函数将为每个父级传递子级,然后递归,直到出现循环情况或达到None

def find_child(x,i):
if i==0:
child_list.clear()
child = parents.get(x)
if child not in child_list:
child_list.append(child)
else:
return child_list
if pd.isnull(child)==False:
find_child(child,1)
return child_list

循环浏览df行,并为每个e_id应用该函数。第二个参数是在递归调用的情况下区分是否清除列表

child_list = []
for idx, row in df.iterrows():
print({row['e_id']:  find_child(row['e_id'], 0)})

输出:

{1.0: None}
{2.0: [3.0, 2.0]}
{3.0: [2.0, 3.0]}
{4.0: [6.0, 1.0, nan]}
{5.0: [4.0, 6.0, 1.0, nan]}
{6.0: [1.0, nan]}

最新更新