首页 > 解决方案 > 需要根据父任务对任务进行排序

问题描述

需要对任务进行排序,一旦列出任务的父级,它就应该按顺序排列。它可以被视为有向无环图(DAG)

在这个特定的例子中,主要问题是:“13 ifhj 5,4,9,15”应该总是出现在 5,4,9 和 15 之后。但是 13 出现在 15 之前。

我正在提供样本输入和预期输出。

口/口:

task_no    t_name     Parent_Task_Numbers
    1       task1       0
    2       task2       0
    3       task3       0
    4       task4       1,2
    5       task5       0
    6       task6       2
    7       task7       4
    8       task8       6,1,4
    9       task9       10
    10      task10      1
    11      task11      2
    12      task12      3
    13      task13      5,4,9,15
    15      task15      7,8,2,10

预期的 o/p:(这可能与此不同,但应该服务于主要思想)

task_no    t_name     Parent_Task_Numbers
    1       task1       0
    2       task2       0
    3       task3       0
    5       task5       0
    10      task10      1
    4       task4       1,2
    9       task9       10
    6       task6       2
    11      task11      2
    12      task12      3
    7       task7       4
    15      task15      7,8,2,10
    13      task13      5,4,9,15
    8       task8       6,1,4

def sort_parent_tasks1(fileName):
    df1 = pd.read_csv(fileName)
    print("df1.Parent_Task_Numbers.str.split(',')", type(df1.Parent_Task_Numbers.str.split(',')))
    df1.Parent_Task_Numbers.str.split(',').apply(sorted, reverse = True).str.join(',').str.strip(',')
    df3 = df1.sort_values(['Parent_Task_Numbers'])
    df3.to_csv("/fileData/task_files/output/test_generated1.csv")


inputFile = "/fileData/task_files/input/test.csv"
sort_parent_tasks1(inputFile)

我得到的是:这是错误的。

tasknumber    taskname    Parent_Task_Numbers
1       task1       0
2       task2       0
3       task3       0
5       task5       0
10      task10      1
4       task4       1,2
9       task9       10
6       task6       2
11      task11      2
12      task12      3
7       task7       4
13      task13      5,4,9,15
8       task8       6,1,4
15      task15      7,8,2,1

标签: pythonpandasdataframebreadth-first-searchdirected-acyclic-graphs

解决方案


https://ipython.org/ipython-doc/dev/parallel/dag_dependencies.html获取输入

import networkx as nx
import matplotlib.pyplot as plt
import pandas as pd



def create_DAG(abs_file = "input.csv"):
    G2 = nx.DiGraph()
    df1 = pd.read_csv(abs_file)
    print(df1)

    for index, row in df1.iterrows():
        print("row['tasknumber']" , row['tasknumber'], "row['Parent_Task_Numbers']", row['Parent_Task_Numbers'])
        parents = row['Parent_Task_Numbers'].split(",")
        for p in parents:
            G2.add_edge(int(p), int(row['tasknumber']))

    nodes = df1["tasknumber"].tolist()
    map(G2.add_node, nodes)

    for item in nodes:
            print("successors of {} is {}".format(item, list(G2.successors(item))))

    # now draw the graph:
    nx.draw(G2, with_labels=True, edge_color='r')
    plt.show()
    print("graph printed ")

    return G2


G2 = create_DAG()

order = nx.topological_sort(G2)
print("order :", order)
abs_file = "input.csv"
df2 = pd.read_csv(abs_file)
df3 = pd.DataFrame(columns=df2.columns)

for task in order:
    row1 = df2.loc[df2['tasknumber'] == task]
    df3 = df3.append(row1, ignore_index=True)


print("rearranged data frame is : ", df3)

推荐阅读