Search code examples
pythonpandasdataframeformatscientific-notation

How to format a pandas dataframe and keep original float precision values


Im using a pandas dataframe to load a received payload, and when format it is not formatted as I would like, example of my code:

import pandas as pd

df = pd.DataFrame([{'A': 2.5e-07, 'B': 2.5e-05, 'C': 2.5e-04, 'D': 0.0001, 'E': 0.01}])

pd.options.display.float_format = '{:f}'.format
print(df.to_string())

pd.set_option('display.float_format', str)
print(df.to_string())

The output:

         A        B        C        D        E
0 0.000000 0.000025 0.000250 0.000100 0.010000

        A       B       C      D    E
0 2.5e-07 2.5e-05 0.00025 0.0001 0.01

what I would like to get:

        A       B       C      D    E
0 0.0000025 0.000025 0.00025 0.0001 0.01

Solution

  • We can use np.format_float_positional:

    import numpy as np
    import pandas as pd
    
    pd.set_option('display.float_format', np.format_float_positional)
    
    df = pd.DataFrame([
        {'A': 2.5e-07, 'B': 2.5e-05, 'C': 2.5e-04, 'D': 0.0001, 'E': 0.01}
    ])
    
    print(df.to_string())
    

    Or with an option_context

    import numpy as np
    import pandas as pd
    
    df = pd.DataFrame([
        {'A': 2.5e-07, 'B': 2.5e-05, 'C': 2.5e-04, 'D': 0.0001, 'E': 0.01}
    ])
    
    with pd.option_context('display.float_format', np.format_float_positional):
        print(df.to_string())
    

    Both Produce:

               A        B       C      D    E
    0 0.00000025 0.000025 0.00025 0.0001 0.01