python - 查找数据框中的所有依赖项

标签 python pandas dataframe

我有一个数据框:

       Parent   Child1  Child2  Child3  Child4  Child5  Child6
0         A       A1      B2      -1     -1       -1     -1
1         B       B1      -1      -1     -1       -1     -1
2         A1      -1      -1      C1     -1       -1     C2
3         D       -1      C2      -1     A1       -1     -1
4         C1      -1      -1      -1     -1       -1     -1
5         C2      -1      -1      -1     -1       -1     -1
6         B1      -1      -1      -1     -1       -1     -1
7         B2      B3      B4      -1     -1       -1     -1
8         B3      -1      -1      -1     -1       -1     -1
9         B4      -1      -1      -1     -1       -1     -1

来源:

df = pd.DataFrame({'Parent': ['A','B','A1','D','C1','C2','B1','B2','B3','B4'],'Child1': ['A1','B1','-1','-1','-1','-1','-1','B3','-1','-1'], 'Child2': ['B2','-1','-1','C2','-1','-1','-1','B4','-1','-1'] , 'Child3' : ['-1','-1','C1','-1','-1','-1','-1','-1','-1','-1'] , 'Child4' : ['-1','-1','-1','A1','-1','-1','-1','-1','-1','-1'],'Child5' : ['-1','-1','-1','-1','-1','-1','-1','-1','-1','-1'] ,'Child6' : ['-1','-1','C2','-1','-1','-1','-1','-1','-1','-1']})

现在,我有一个包含几个父级的输入列表,例如 parent_list = ['A', 'B']。我需要找到所有这些 parent 的所有 child 。 因此,对于“A”,有两个子项:A1 和 B2。 A1 又有两个 child “C1”和“C2”。但“C1”和“C2”没有 child (如果所有 child 都是“-1”,则他们没有 child ),而 B2 有两个 child -“B3”和“B4”。 B3 和 B4 都没有 child ,继续 B 只有一个 child :“B1”和“B1”没有 child 。

因此 ['A', 'B'] 的最终系列列表将是 ['A', 'B', 'A1', 'B2', ' C1'、'C2'、'B3'、'B4'、'B1']

这是我能达到的目标:

parent_list= ['A','B']
tmp_list = []
output_list = []
child_list= []

for i in parent_list:
  output_list.append(i) if i not in output_list else output_list 
  parent_list.remove(i)
  tmp_list = df.loc[df['Parent']  == i, ['Child1','Child2','Child3','Child4','Child5','Child6']].values.flatten().tolist()
  while '-1' in tmp_list: tmp_list.remove('-1')
  if  tmp_list:
    parent_list = parent_list + tmp_list

但是,我的代码仅在parent_list 中运行i = 'A' 并停止。我不确定为什么它不会进一步迭代。当我在第一次迭代后检查parent_list时,我确实看到了我想看到的内容,但没有发生循环。我哪里做错了?

此外,如果有更好的方法来解决这个问题,请提出建议。

最佳答案

我们可以melt数据帧,然后在 networkx 的帮助下创建一个有向图,然后使用 descendents方法在 parent_list

中查找每个父节点的所有子节点
import networkx as nx

s = df.melt('Parent').astype(str).query("value != '-1'")
G = nx.from_pandas_edgelist(s, 'Parent', 'value', create_using=nx.DiGraph())
family = parent_list + [d for n in parent_list for d in nx.descendants(G, n)]

>>> family

['A', 'B', 'C1', 'C2', 'B3', 'B2', 'B4', 'A1', 'B1']

关于python - 查找数据框中的所有依赖项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69592841/

相关文章:

python - 在 matplotlib 中获取每周时间序列数据的异常折线图

python-3.x - 如何在分组和聚合操作后访问 Pandas DataFrame 中的某一行

python - NoneType 对象没有要获取的属性(Tkinter)

python - 来自连接的 SQLAlchemy 声明属性(单个属性,而不是整个对象)

python - 根据其他数据帧的比较创建带有列的 Pandas 数据帧

python - 有效地将数据从 CSV 读取到具有多个分隔符的数据框中

python - 给定位数时生成 66666 等数字的最快方法

python - 使用Flask,尝试让AJAX在更新mongo记录后更新span,但它打开一个新页面

python - 比较 2 个连续的行,如果不同则分配递增的值(使用 Pandas)

python - 拆分 Pandas 数据框