python - 需要根据父任务对任务进行排序
问题描述
需要对任务进行排序,一旦列出任务的父级,它就应该按顺序排列。它可以被视为有向无环图(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
解决方案
从 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)
推荐阅读
- javascript - Express.JS response.download 不下载文件
- api - 如何绕过 SSL 证书验证?
- javascript - 如何从 HTML 表中检索值以发布到 PHP
- javascript - 在反应js中创建动态数组
- javascript - 点击时添加事件监听器
- html - 删除包装器和主容器之间的空间
- r - 如何使用 ggplot2 在 SpatialLinesDataFrame 上添加点?
- ruby - 当我使用 require_relative 时,Ruby 找不到类
- android - 如何使用任务 gradle 删除文件
- html - HTML+CSS - 顶部导航栏不会跨屏 100% 宽度