TeoK
TeoK

Reputation: 501

apply my function if...else statement with condition doesn't pass

my input(as example):

df = pd.DataFrame({'frame':[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15],'sum_result_ICV':[0,1,1,1,2,2,2,2,1,1,1,1,1,1,1,0], 'sum_result_AO':[0,1,1,1,0,0,0,0,1,1,1,1,1,1,1,0]})
dd['result_ICV'] = 0
dd['result_ATO'] = 0

My code and my_func:

for z in range(0,len(cv_details)):
            def result_func(row):
                for i in range(0,len(dd)):
                    if row==2:
                        return(cv_details[z])
                    elif row==1:
                        if dd.loc[dd['sum_result_'+cv_details[z]]==2,'frame'].empty:
                            return ('ReviewNG-'+cv_details[z])
                        elif (dd['frame'][i]-dd.loc[dd.iloc[:,z+1]==2,'frame'].iloc[0]) <=3 :
                            return('NG-'+cv_details[z])                                
                        elif (dd['frame'][i]-dd.loc[dd.iloc[:,z+1]==2,'frame'].iloc[-1]) <=3 :  
                             return('NG-'+cv_details[z]) 
                        else:
                             return('ReviewNG-'+cv_details[z])
                    elif row==0:
                        return('Other')
                    else:
                        return ""
            dd.iloc[:,z+3]=dd.iloc[:,z+1].apply(result_func)

I expect:
enter image description here

But my output:

enter image description here

So as you can see: I need some condition, for example: "if sum_result_ICV equal 0 -> put "Other", if 'sum_result_ICV' equal 1 AND difference of (Number of Frame minus Number where first/last Frame==2) equal or less than 3 -> put "NG-ICV" in other wise "ReviewNG-ICV"(for example number of frame 11 where in sum_result_ICV was 1 and in distance from number 7 of frame where was sum_result_ICV equal 2, so 11-7>3 put "ReviewNG-ICV" ). In my example frame from 1 to 3 must be "NG-ICV", and also from 8 to 10. But from 11 to 14 it must be "ReviewBG-ICV". Also, please see pic that I expect from my function. So what I do wrong?

UPDATE based an answer of @woblob

That new code with loop:

for z in range(0,len(cv_details)):
    df.iloc[df.iloc[:,z+1].to_numpy()==0, z+2 ] = 'Other'
    mask2= df.iloc[:,z+1]==2
    mask1 =df.iloc[:,z+1]==1
    df.iloc[mask2,z+2]=cv_details[z]
    if df.loc[mask2,'frame'].empty:
        df.iloc[mask1,z+2]='ReviewNG-'+cv_details[z]
    else:
        df_frame_first=df.loc[mask2,'frame'].iloc[0]
        df_frame_last=df.loc[mask2,'frame'] .iloc[-1]  
        mask_lt_3 = ((df.frame - df_frame_first) <= 3) | (df.frame - df_frame_last <= 3)
        ones_lt_3 = mask1 & mask_lt_3
        ones_not_lt_3 = mask1 & (~mask_lt_3)
        df.iloc[ones_lt_3, z+2] = 'NG-'+cv_details[z]
        df.iloc[ones_not_lt_3 , z+2] = 'ReviewNG-'+cv_details[z]

Upvotes: 0

Views: 103

Answers (1)

woblob
woblob

Reputation: 1377

As I was trying to untangle the logic, I reworked it completely.

dd.loc[dd.result == 0, "sum_result"] = 'Other'
mask2 = dd.result == 2 
mask1 = dd.result == 1
dd.loc[mask2, "sum_result"] = 'ICV'
if dd.loc[mask2,'frame'].empty:
    dd.loc[mask1, "sum_result"] = 'No sum_result==2'
else:
    dd_frame_first = dd.loc[mask2,'frame'].iloc[0]
    dd_frame_last = dd.loc[mask2,'frame'].iloc[-1]    
    mask_lt_3 = ((dd.frame - dd_frame_first) <= 3) | (dd.frame - dd_frame_last <= 3)
    ones_lt_3 = mask1 & mask_lt_3
    ones_not_lt_3 = mask1 & (~mask_lt_3)
    dd.loc[ones_lt_3, "sum_result"] = 'NG-ICV'
    dd.loc[ones_not_lt_3 , "sum_result"] = 'ReviewNG-ICV'

Upvotes: 1

Related Questions