我正在寻找建立谁向谁报告的层次结构,并为每条记录创建报告结构。
我的原始数据包括两列: e_id和s_id:
,我想创建一个包含如下结构的字典变量。列表的最左边的值将爬升层次结构,而字典键为记录e_id值。
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]}
根据我的理解,这将是一个apply方法,我只是对如何设置它以读取其他行并返回该行的s_id值感到困惑。
提前谢谢!
答案 0 :(得分:0)
使用networkx
图可能会有更好的方法。但这是一个简单的解决方案。
df = pd.DataFrame({'e_id': [1,2,3,4,5,6],
's_id': [None,3,2,6,4,1]})
与父母和孩子一起创建字典
parents = dict(zip(df.e_id, df.s_id))
该函数将为每个通过的父级获取一个孩子,然后递归直到出现循环情况或达到无
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]}