Как отформатировать фрейм данных pandas и сохранить исходные значения точности с плавающей точкой

#python #pandas #dataframe #format #scientific-notation

Вопрос:

Я использую фрейм данных pandas для загрузки полученной полезной нагрузки, и когда он форматируется не так, как хотелось бы, пример моего кода:

 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())
 

Вывод:

          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

 

что я хотел бы получить:

         A       B       C      D    E
0 0.0000025 0.000025 0.00025 0.0001 0.01
 

Ответ №1:

Мы можем использовать 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())
 

Или с помощью 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())
 

Оба Производят:

            A        B       C      D    E
0 0.00000025 0.000025 0.00025 0.0001 0.01
 

Ответ №2:

Вы можете изменить количество десятичных знаков с плавающей запятой, но это применяется ко всем значениям.

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

In [62]: formats = {"A": "{:,.8f}","B": "{:,.6f}", "C": "{:,.5f}", "D": "{:,.4f}", "E": "{:,.2f}"}

In [63]: for col, f in formats.items():
    ...:     df[col] = df[col].map(lambda x: f.format(x))
    ...: 

In [64]: df
Out[64]: 
            A         B        C       D     E
0  0.00000025  0.000025  0.00025  0.0001  0.01
 

Комментарии:

1. в этом проблема, я хотел бы применить формат, но не затрагивая все поля, другими словами, сохраняя точную точность для каждого из полей

2. @Leo проверьте обновленный ответ.

3. ваш ответ решает проблему, но форматирование по полям исправлено, на практике плавающая точка может иметь несколько знаков после запятой

4. @Leo да, это жестко закодировано, я бы посоветовал вам согласиться с ответом Генри Экера.