我有一个数据框。我想发送有关整个过程状态的电子邮件。如果一个任务在一个过程中失败,那么整个过程都会失败。如果所有任务都在一个过程中成功,则该过程成功。在我的代码中创建此逻辑时遇到了一些困难。
Process ID Task Execution Date Execution Time Start Date Start Time End Date End Time Status Emails
1 A 7/30/2019 13:15:00 7/31/2019 9:21:31 7/31/2019 9:21:51 Successful Not valid for this task.
1 B 7/30/2019 13:15:00 7/31/2019 9:23:41 7/31/2019 9:25:16 Successful Not valid for this task.
1 C 7/30/2019 13:15:00 7/31/2019 9:28:03 7/31/2019 9:28:28 Successful Not valid for this task.
1 D 7/30/2019 13:15:00 7/31/2019 9:19:22 7/31/2019 9:20:13 Successful Not valid for this task.
1 E 7/30/2019 13:15:00 7/31/2019 9:32:20 7/31/2019 9:32:40 Successful ['user1@gmail.com', 'user2@gmail.com', 'user3@gmail.com']
1 F 7/30/2019 13:15:00 7/31/2019 9:30:15 7/31/2019 9:30:35 Successful Not valid for this task.
1 G 7/30/2019 13:15:00 7/31/2019 9:17:17 7/31/2019 9:17:42 Successful Not valid for this task.
1 H 7/30/2019 13:15:00 7/31/2019 9:25:51 7/31/2019 9:26:31 Successful Not valid for this task.
2 A 8/1/2019 1:00:00 7/31/2019 23:06:22 7/31/2019 23:06:52 Successful ['user1@gmail.com', 'user2@gmail.com', 'user3@gmail.com']
2 B 8/1/2019 1:00:00 7/31/2019 23:03:30 7/31/2019 23:04:10 Successful Not valid for this task.
2 C 8/1/2019 1:00:00 7/31/2019 23:01:07 7/31/2019 23:01:37 FAILED ` Not valid for this task.
我不确定将这种逻辑包含到我的代码中最有效的方法是什么。最终,它将针对超过100个具有任意数量任务的流程进行扩展。我应该将其保留为数据框还是更适合其他数据结构?是否应为最终成功状态创建变量?最终,我想使用数据框中的信息来基于与流程关联的电子邮件发送电子邮件。这就是为什么我要将其保留在数据框中。
在这种情况下,逻辑Process 1
为Successful
,而Process 2
为FAILED
答案 0 :(得分:0)
按进程ID分组并使用指示符随机变量进行FAILED的发生原则上可以解决您的问题。例如,您可以将失败进程的所有状态值设置为FAILED。
def status_summary(x):
if 'FAILED' in x['Status'].values:
x['Status'] = 'FAILED'
return x
df = df.groupby('Process_ID').apply(status_summary)
df[['Process_ID', 'Task', 'Status']]
Out[79]:
Process_ID Task Status
0 1 A Successful
1 1 B Successful
2 1 C Successful
3 1 D Successful
4 1 E Successful
5 1 F Successful
6 1 G Successful
7 1 H Successful
8 2 A FAILED
9 2 B FAILED
10 2 C FAILED
由于最好保留原始信息,因此您可以准备单独的状态摘要。
process_status = df.groupby(['Process_ID'])['Status'].apply(
lambda x: 'FAILED' if 'FAILED' in x.values else 'Success').reset_index()
process_status
Out[89]:
Process_ID Status
0 1 Success
1 2 FAILED