基于OR条件创建变量/列

时间:2019-08-05 16:12:26

标签: python pandas dictionary if-statement

我有一个数据框。我想发送有关整个过程状态的电子邮件。如果一个任务在一个过程中失败,那么整个过程都会失败。如果所有任务都在一个过程中成功,则该过程成功。在我的代码中创建此逻辑时遇到了一些困难。

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 1Successful,而Process 2FAILED

1 个答案:

答案 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