我在表中有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通过
答案 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'})