Преобразование чисел в научную нотацию

#python #pandas #numpy

#питон #панды #тупица

Вопрос:

У меня есть фрейм данных, в котором один столбец (old_column) выглядит следующим образом:

9.888E8
3.428E9
5.189E8
4.9E7
2.1E7
340,0
4100,0
1000,0
860,0
1000,0

Есть ли какой-нибудь способ преобразовать этот столбец в (new_column) что-то вроде этого:

9.888E8
3.428E9
5.189E8
4.9E7
2.1E7
3.4E2
4.1E3
1E3
8.6E2
1E3

Поэтому я хотел бы, чтобы все числа были записаны в научной нотации XXEX .

Я пытался использовать этот метод:

новый столбец = ‘{:.2e}’.формат(старый столбец)

но не работает или я не знаю, как им пользоваться 🙂

Какие-нибудь советы или предложения?

Спасибо.

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

1. f'{n:0.2e}' может быть?

2. каков тип dtype этого столбца?

3. dtype является плавающим …

Ответ №1:

Вы можете установить display.float_format параметр в функцию, которая принимает float и возвращает строку, представляющую значение с плавающей точкой.

 pd.set_option('display.float_format', lambda x: f'{x:.2e}')  

Выход:

 gt;gt;gt; old_column # notice that you don't need to create a new column at all, since all the above code does is change the way the data is rendered. 0 9.89e 08 1 3.43e 09 2 5.19e 08 3 4.90e 07 4 2.10e 07 5 3.40e 02 6 4.10e 03 7 1.00e 03 8 8.60e 02 9 1.00e 03 Name: a, dtype: float64  

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

1. Могу ли я сохранить dtype: float без объекта?

2. Этот код преобразует значение с плавающей точкой в строку в специальном формате, таким образом object , dtype. Если вы хотите сохранить float dtype, нам нужно придумать другое решение, возможно, изменив некоторые панды (если они существуют).

3. @user16454053 проверьте ответ прямо сейчас 😉

Ответ №2:

 In [63]: """9.888E8  ...: 3.428E9  ...: 5.189E8  ...: 4.9E7  ...: 2.1E7  ...: 340.0  ...: 4100.0  ...: 1000.0  ...: 860.0  ...: 1000.0""".splitlines() ... In [64]: arr=np.array(_,float) In [65]: arr Out[65]:  array([9.888e 08, 3.428e 09, 5.189e 08, 4.900e 07, 2.100e 07, 3.400e 02,  4.100e 03, 1.000e 03, 8.600e 02, 1.000e 03])  

numpy использует научную нотацию для всего массива, если диапазон значений достаточно велик.

Список отображает каждое значение в своем собственном формате:

 In [66]: arr.tolist() Out[66]:  [988800000.0,  3428000000.0,  518900000.0,  49000000.0,  21000000.0,  340.0,  4100.0,  1000.0,  860.0,  1000.0]  

Теперь поместите массив в фрейм данных:

 In [68]: import pandas as pd In [69]: df = pd.DataFrame(arr) In [70]: df Out[70]:   0 0 9.888000e 08 1 3.428000e 09 2 5.189000e 08 3 4.900000e 07 4 2.100000e 07 5 3.400000e 02 6 4.100000e 03 7 1.000000e 03 8 8.600000e 02 9 1.000000e 03  In [72]: df.info() lt;class 'pandas.core.frame.DataFrame'gt; RangeIndex: 10 entries, 0 to 9 Data columns (total 1 columns):  # Column Non-Null Count Dtype  --- ------ -------------- -----   0 0 10 non-null float64 dtypes: float64(1) memory usage: 208.0 bytes  

Я спросил о dtype, потому что ожидал, что столбец с плавающей точкой будет использовать один и тот же формат для всех значений, такой же, как numpy.

Опция отображения изменяет отображение, но не изменяет тип dtype:

 In [75]: pd.set_option('display.float_format', lambda x: f'{x:.2e}') In [76]: df Out[76]:   0 0 9.89e 08 1 3.43e 09 2 5.19e 08 3 4.90e 07 4 2.10e 07 5 3.40e 02 6 4.10e 03 7 1.00e 03 8 8.60e 02 9 1.00e 03 In [77]: df.info() lt;class 'pandas.core.frame.DataFrame'gt; RangeIndex: 10 entries, 0 to 9 Data columns (total 1 columns):  # Column Non-Null Count Dtype  --- ------ -------------- -----   0 0 10 non-null float64 dtypes: float64(1) memory usage: 208.0 bytes  

Я получаю сочетание форматов, если создаю кадр из исходного списка строк. Но теперь значения являются строками, а не плавающими.

 In [80]: pd.DataFrame(Out[63]) Out[80]:   0 0 9.888E8 1 3.428E9 2 5.189E8 3 4.9E7 4 2.1E7 5 340.0 6 4100.0 7 1000.0 8 860.0 9 1000.0 In [81]: df1=pd.DataFrame(Out[63]) In [82]: df1.info() lt;class 'pandas.core.frame.DataFrame'gt; RangeIndex: 10 entries, 0 to 9 Data columns (total 1 columns):  # Column Non-Null Count Dtype  --- ------ -------------- -----   0 0 10 non-null object dtypes: object(1) memory usage: 208.0  bytes