1

I have five data frames. I want to subtract 1.00 from all dataframes containing values equal to 1 or less than 1.

DT   D1   D2
0   1.0  1.0


RE   E1   E2   E3
0   1.0  1.0  0.8


FE   F1   F2
0   1.0  0.63


SE   S1   S2
0   1.0  1.0


DT   D1             D2          
RE   E1   E2   E3   E1   E2   E3
0   1.0  1.0  1.0  1.0  0.45  1.0


DT   D1                            D2                         
RE   E1        E2        E3        E1        E2        E3     
FE   F1   F2   F1   F2   F1   F2   F1   F2   F1   F2   F1   F2
0   1.0  0.0  0.0  1.0  1.0  1.0  1.0  1.0  1.0  0.0  1.0  1.0

I tried following for all dataframes, however, in some cases I get large negative values like 1.110223e-16, -2.220446e-16. How to avoid these values?

df = 1.00 - df
Deduplicator
  • 44,692
  • 7
  • 66
  • 118
PRO88
  • 447
  • 2
  • 9

1 Answers1

3

1.110223e-16 isn't a large, negative value. It's actually an extremely small positive value. The e-16 represents a tiny exponent.

1e-2
# 0.01

1e-4
# 0.0001

print('{:.16f}'.format(1e-16))
# 0.0000000000000001

My guess is you're running into floating point inconsistencies. For example, the 1s in your data may actually have tiny floating point fractions:

1 + 1.110223e-16
# 1.0

It's just that you don't get to see it when you print out your DataFrames.


One suggestion I would have is to use np.isclose and set these near 0 values to zero.

df.values[np.isclose(df.values, 0)] = 0
cs95
  • 379,657
  • 97
  • 704
  • 746