Home > Back-end >  Pandas keep decimal part of values like .998344 after round(2) applied to series
Pandas keep decimal part of values like .998344 after round(2) applied to series

Time:11-02

I have dataset with float values with 6 decimals. I need to round it to two decimals.The problem becams with some floats nearly close to 1. After applying round(2) I got 1.00 instead of 0.99. May be this is mathematically right, but I need to have values like 0.99. My customer needs two decimals as result, I cant change it.

ones_list = [0.998344, 0.996176, 0.998344, 0.998082]
df = pd.DataFrame(ones_list, columns=['value_to_round'])
df['value_to_round'].round(2)

1.0
1.0
1.0
1.0

CodePudding user response:

Please refer to the basic of rounding in math, you are trying to round 2 digits behind the dot using .round(2)

if you round 0.999 using .round(2), of course you'll get 1.0 because the last '9' digit (0.009) will become 0.01 thus will be added to 0.09 and become 0.1 added again with 0.9 and finally becomes 1.0

If you really want to have values like 0.99, just take the two decimals behind the dot. You can try either the following methods:

import math

df['value_to_round'] = df['value_to_round'] * 100
df['value_to_round'] = df['value_to_round'].apply(math.trunc)
df['value_to_round'] = df['value_to_round'] / 100

or

df['value_to_round'] = df['value_to_round'].astype(str)
df['value_to_round'] = df['value_to_round'].str[:4]
df['value_to_round'] = df['value_to_round'].astype(float)

I experienced the same thing when I was trying to show R squared value, what I did is just use .round(3), because 3 digits decimal wouldn't hurt

I hope this helps :)

CodePudding user response:

I see a few options:

  • use floor instead of round (but would you have the same issue with 0.005?)

  • use clip to set a maximum (and a min?) value in the column of 0.99:

    df['value_to_round'].round(2).clip(upper=0.99)
    

CodePudding user response:

df['value_to_round'] = [x if x < 1 else 0.99 for x in df['value_to_round'].round(2)]

  • Related