Round to nearest even integer with condition applied using Python

Question:

I wish to round the values to the nearest even number – however if value is 0.5 ; round this to the number 2.

Data

ID  Q121 Q221 Q321 Q421 Q122 
AA  0.5  0.5  6.6  11.4 6.8
BB  8.5  6.5  3.1  5.3  7.2 

Desired

ID  Q121 Q221 Q321 Q421 Q122 
AA  2.0  2.0  6.0  12   6.0  
BB  8.0  6.0  4.0  6.0  8.0  

Doing

df.iloc[:,1:].astype(float).div(2).round()
    

However, this only rounds the numbers to nearest even without the condition applied. I am still researching, any suggestion is appreciated.

Asked By: Lynn

||

Answers:

edited:

# round as the expected result shows
df.iloc[:,1:] = df.iloc[:,1:].applymap(lambda   x:  int(x) if x > .5 else 1)
# making it even
df.iloc[:,1:] = df.iloc[:,1:].applymap(lambda x: x if x%2==0 else x+1)
ID Q121 Q221 Q321 Q421 Q122
0 AA 2 2 6 12 6
1 BB 8 6 4 6 8
Answered By: MAFiA303

here is one way to do it

# 0.5 being a special case, where it need to be made into 2
# check if value is zero when made into int, if so, make it 1

df.iloc[:,1:]=np.where(df.iloc[:,1:].astype(int)==0,
                       1, 
                       df.iloc[:,1:])

# if int value is odd, add 1 to it, else leave it as is
df.iloc[:,1:]=np.where(df.iloc[:,1:].astype(int)%2==1,
                       df.iloc[:,1:].astype(int) +1, 
                       df.iloc[:,1:].astype(int))
 
df
    ID  Q121    Q221    Q321    Q421    Q122
0   AA     2       2       6      12       6
1   BB     8       6       4       6       8

if 0.5 should be made to zero then

df.iloc[:,1:]=np.where(df.iloc[:,1:].astype(int)%2==1,
                       df.iloc[:,1:].astype(int) +1, 
                       df.iloc[:,1:].astype(int))
    ID  Q121    Q221    Q321    Q421    Q122
0   AA     0       0       6      12       6
1   BB     8       6       4       6       8
Answered By: Naveed
Categories: questions Tags: , ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.