#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