为数据框中两个列值的组合在特定条件下添加新列

时间:2019-05-04 10:17:21

标签: python python-3.x pandas python-2.7 pandas-groupby

我在表中有3列,最后一列为“ Status”。我希望将表分组并添加新列“ Final Status”。如果对于任何dept_id和session_id组合,最终状态在原始表中为“ fail”,则该状态应为“ fail”。

我的数据和预期结果如下:

Dept_id   Session_id   Status
a         S1           Pass
a         S1           Pass 
a         S1           Fail
b         S1           Pass
b         S1           Pass
c         S1           Fail
a         S2           Pass
a         S2           Pass

预期结果:

Dept_id    Session_id    Final_Status
a          S1            Fail
b          S1            Pass 
c          S1            Fail
a          S2            Pass

说明-由于组合“ a”和“ S1”的状态为“失败”,因此最终状态为失败,而组合“ b”和“ S1”的状态为“失败”,因此Final_Status通过

2 个答案:

答案 0 :(得分:0)

使用以下内容:

方法1

s=df.Dept_id.ne(df.Dept_id.shift()).cumsum()
df1=df.groupby([s,'Dept_id','Session_id'])['Status']\
           .apply(lambda x: x.eq('Fail').any()).reset_index([1,2]).rename_axis(None)

此输出:

  Dept_id Session_id  Status
1       a         S1    True
2       b         S1   False
3       c         S1    True
4       a         S2   False

方法2

您还可以在不使用帮助程序系列的情况下使用groupby(但是它将对索引进行排序,并且将不执行顺序):

df1=(df.groupby(['Dept_id','Session_id'])['Status']
          .apply(lambda x: x.eq('Fail').any()).reset_index())

输出:

  Dept_id Session_id  Status
0       a         S1    True
1       a         S2   False #sorted by Dept_id
2       b         S1   False
3       c         S1    True

然后我们使用np.where()map的是非值。

df1.Status=np.where(df1.Status,'Fail','Pass')
print(df1)

  Dept_id Session_id Status
1       a         S1   Fail
2       b         S1   Pass
3       c         S1   Fail
4       a         S2   Pass

详细信息 s是创建的帮助器系列,以便我们可以在Dept_id每次更改时进行分组:

print(s)

0    1
1    1
2    1
3    2
4    2
5    3
6    4
7    4

答案 1 :(得分:0)

您也可以尝试以下答案:

df.replace({'Pass':True,'Fail':False}).groupby(['Dept_id', 'Session_id']).all().reset_index().replace({'True':'Pass','False':'Fail'})