Как преобразовать числа с плавающей запятой в целые числа в Pandas
Вы можете использовать следующий синтаксис для преобразования столбца в pandas DataFrame из числа с плавающей запятой в целое число:
df['float_column'] = df['float_column'].astype (int)
В следующих примерах показано, как использовать этот синтаксис на практике.
Пример 1: преобразование одного столбца из числа с плавающей запятой в целое число
Предположим, у нас есть следующие Pandas DataFrame:
import pandas as pd #create DataFrame df = pd.DataFrame() #view data types for each column df.dtypes player object points float64 assists float64 dtype: object
Мы видим, что столбцы очков и помощи имеют тип данных float.
В следующем коде показано, как преобразовать столбец точек из числа с плавающей запятой в целое число:
#convert 'points' column to integer df['points'] = df['points'].astype (int) #view data types of each column df.dtypes player object points int32 assists float64 dtype: object
Мы видим, что столбец точек теперь является целым числом, а все остальные столбцы остались без изменений.
Пример 2. Преобразование нескольких столбцов в целое число
В следующем коде показано, как преобразовать несколько столбцов в DataFrame из числа с плавающей запятой в целое число:
import pandas as pd #create DataFrame df = pd.DataFrame() #convert 'points' and 'assists' columns to integer df[['points', 'assists']] = df[['points', 'assists']].astype (int) #view data types for each column df.dtypes player object points int32 assists int32 dtype: object
Мы видим, что столбцы баллов и передач были преобразованы из чисел с плавающей запятой в целые числа.
Дополнительные ресурсы
В следующих руководствах объясняется, как выполнять другие распространенные преобразования в Python:
Преобразование float в int с инициализацией переменной на лету, адекватно?
Каким путем? У вас не ясно какой тип у x.
Видимо подразумевается, что x — int.
Выражение 2 * (a + y) в итоге имеет тип float.
Если x — int, то выражение будет преобразовано к int.
Правильно отбрасывать дробную часть или нет — зависит от задачи.
Если надо — отбрасывайте. Предложенный способ — вполне годный.
В любом случае лучше использовать явное преобразование. Это поможет людям, которые будут смотреть ваш код, понять, что это преобразование именно так и задумывалось, а не получилось случайно.
Рекомендую поставить опции компилятора на максимальные предупреждения и соответствия стандарту (для gcc -std=c11 -Wall -Wextra -pedantic) и пишите код так, что бы при сборке у компилятора не было предупреждений. Многие используют еще и -Werror — это прост вынуждает вас писать код без предупреждений, т.к. они теперь станут ошибками.
Тема: Преобразование из float в int
![]()
Преобразование из float в int
Привет всем, есть вопрос в плане передачи переменной int с пр200 на пк через преобразователь где установлена будет скада, пока не знаю что за версия.
например нужно мне отслеживать давление, изначально, в софте значение давления это переменная флоат, число с хвостом, например 2.5 бар, преобразую например в интежер, получаеться 2 бар.
Как сделать чтобы данные в скаде отображались правильно так же 2.5. бар а не 2 бар
10.03.2022, 15:17 #2
- Просмотр профиля
- Сообщения форума
- Личное сообщение
- Домашняя страница
- Просмотр статей
![]()
Пользователь Регистрация 25.06.2011 Адрес Галактика Андромеды (M31) Сообщений 8,036
Сообщение от batur 
Привет всем, есть вопрос в плане передачи переменной int с пр200 на пк через преобразователь где установлена будет скада, пока не знаю что за версия.
например нужно мне отслеживать давление, изначально, в софте значение давления это переменная флоат, число с хвостом, например 2.5 бар, преобразую например в интежер, получаеться 2 бар.
Как сделать чтобы данные в скаде отображались правильно так же 2.5. бар а не 2 бар
Такое впечатление, что Вы «первый раз замужем»(БМП), короче, округлите до десятых долей, умножьте на 10 и преобразуйте в инт, в ПР всё!
В скаде(или ОРС-сервере) преобразуете обратно во флоат и разделите на 10(перенести запятую на один знак влево), всё!
Последний раз редактировалось Сергей0308; 10.03.2022 в 15:26 .
Если проблему можно решить за деньги, это не проблема, это расходы. Бог каждому посылает проблемы по его силам. Так что одно из двух. Либо ты можешь-таки
справиться с проблемами, либо это не твои проблемы.
Как из float сделать int
Чето не могу найти нормального решения, которое было бы быстрее чем стандарные.
Я делаю так:
int i; float f=5.68; i=(int)f;
Возможно ли более быстро сделать данное преобразование?
Просто вычисления с float’ом работают раза в 2 медленнее чем с int’ом, а точность большая не нужна.
Дело в том что напрягает загрузка процессора, т.к. это дело в многократно вызываемом цикле.
Может есть какой-нить алгоритм на асме пошустрее? Или может какой-нить совет по настройкам оптимизации проекта. Интересны все предложения.
И ещё вопрос:
Что быстрее
a=i*256;
Re: Подскажите как быстро преобразовать float в int.
| От: | Socrat |
| Дата: | 29.06.06 10:19 |
| Оценка: |
Здравствуйте, Voit, Вы писали:
V>Чето не могу найти нормального решения, которое было бы быстрее чем стандарные.
V>Я делаю так:
V>
V>int i; V>float f=5.68; V>i=(int)f; V>
V>Возможно ли более быстро сделать данное преобразование?
Нельзя. Если даже ты не используешь сопроцессор, вряд ли ты сможешь написать преобразование более быстрое, чем уже есть.
V>Просто вычисления с float’ом работают раза в 2 медленнее чем с int’ом, а точность большая не нужна.
V>Дело в том что напрягает загрузка процессора, т.к. это дело в многократно вызываемом цикле.
Можно попробовать обойтись без плавающей точки.
V>Может есть какой-нить алгоритм на асме пошустрее? Или может какой-нить совет по настройкам оптимизации проекта. Интересны все предложения.
V>И ещё вопрос:
V>Что быстрее
V>a=i*256; V>
V>a=i>>8; V>
Сдвиг быстрей. Только не туда двигаешь.
Re[2]: Подскажите как быстро преобразовать float в int.
| От: | Сергей Мухин | |
| Дата: | 29.06.06 10:35 | |
| Оценка: | +1 -1 | |
Здравствуйте, Socrat, Вы писали:
V>>Что быстрее
V>>
V>>a=i*256; V>>
V>>a=i>>8; V>>
с какого испуга?
посмотри генерацию (при вкл оптим).
—
С уважением,
Сергей Мухин
Re: Подскажите как быстро преобразовать float в int.
| От: | Какая разница |
| Дата: | 29.06.06 10:42 |
| Оценка: |
Здравствуйте, Voit, Вы писали:
V>Чето не могу найти нормального решения, которое было бы быстрее чем стандарные.
V>Я делаю так:
V>
V>int i; V>float f=5.68; V>i=(int)f; V>
V>Возможно ли более быстро сделать данное преобразование?
Откуда уверенность что это самое узкое место в твоей программе?
Что тебе даст выиграш нескольких тактов процессора если ты умудришся
на асме запрограмировать быстрее чем компалятор?
Сомневаюсь что сможешь это сделать лучше
Сначала надо взять профилер в зубы и найти в программе те куски которые дают наибольшие тормоза
Поверь мне это будет не это преобразование
ЗЫ Ну и неплохо было бы преобразовать в инт поинтелегентней (по правилам округления)
i=(int) (f + 0.5f);
Re: Подскажите как быстро преобразовать float в int.
| От: | Какая разница |
| Дата: | 29.06.06 10:50 |
| Оценка: |
Здравствуйте, Voit, Вы писали:
.
V>И ещё вопрос:
V>Что быстрее
V>a=i*256; V>
V>a=i>>8; V>
Расслабься и не мучай себя сомнениями
Нормальный оптимизирующий компилятор сам знает что быстрей и сам сдвинет побитово
если это будет быстрее чем умножение
ЗЫ Причем сдвинет влево а не вправо как ты
Re: Подскажите как быстро преобразовать float в int.
| От: | Sh1ZoID | http://vkontakte.ru/id6263850 |
| Дата: | 29.06.06 11:08 | |
| Оценка: |
Здравствуйте, Voit, Вы писали:
V>Что быстрее
V>a=i*256; V>
V>a=i>>8; V>
int i = 23;
int c = i c = i * 255; //255
;int i = 23; 0041368E mov dword ptr [i],17h ;int c = i mov eax,dword ptr [i] 00413698 shl eax,8 ;смещает 0041369B mov dword ptr [c],eax ;c = i * 255; 0041369E mov eax,dword ptr [i] 004136A1 imul eax,eax,0FFh ;умножает 004136A7 mov dword ptr [c],eax
int i = 23;
int c = i c = i * 256; //256
;int i = 23; 0041368E mov dword ptr [i],17h ;int c = i mov eax,dword ptr [i] 00413698 shl eax,8 ;смещает 0041369B mov dword ptr [c],eax ;c = i * 255; 0041369E mov eax,dword ptr [i] 004136A1 shl eax,8 ;смещает 004136A7 mov dword ptr [c],eax
В теории(и ессно, если на асме пишешь), конечно разница есть(сдвиг быстрее), но на практике чаще нет, чем да. Так что умножай на здоровье
Re: Подскажите как быстро преобразовать float в int.
| От: | Leo Yuriev | https://github.com/erthink |
| Дата: | 29.06.06 11:13 | |
| Оценка: | 1 (1) +1 | |
Здравствуйте, Voit, Вы писали:
V>Чето не могу найти нормального решения, которое было бы быстрее чем стандарные.
V>Я делаю так:
V>
V>int i; V>float f=5.68; V>i=(int)f; V>
V>Возможно ли более быстро сделать данное преобразование?
V>Просто вычисления с float’ом работают раза в 2 медленнее чем с int’ом, а точность большая не нужна.
V>Дело в том что напрягает загрузка процессора, т.к. это дело в многократно вызываемом цикле.
V>Может есть какой-нить алгоритм на асме пошустрее? Или может какой-нить совет по настройкам оптимизации проекта. Интересны все предложения.
Сильно зависит от вида процессора, на x86 процессор имеет команду сохраниния float в int, при этом автоматически и бысто делает округление к ближайщему целому. Но по правилам C/C++ преобразование float в int должно выполняться с усечением. Поэтому i=(int)f выполняется отдельной библиотечной функцией, которая сохраняет режим FPU, меняет его режим округления на уселечение, сохраняет float в int и восстанавливает режим FPU. Сделать быстрее можно только через inline-assembler (будет равносильно i=(int)(f + .5)). Синтаксис зависит от компилятора, см. команды fld, fistp и fist.
V>И ещё вопрос:
V>Что быстрее
V>a=i*256; V>
V>a=i>>8; V>
Re[2]: Подскажите как быстро преобразовать float в int.
| От: | Voit |
| Дата: | 29.06.06 11:29 |
| Оценка: |
Здравствуйте, Leo Yuriev, Вы писали:
LY>Здравствуйте, Voit, Вы писали:
V>>Чето не могу найти нормального решения, которое было бы быстрее чем стандарные.
V>>Я делаю так:
V>>
V>>int i; V>>float f=5.68; V>>i=(int)f; V>>
V>>Возможно ли более быстро сделать данное преобразование?
V>>Просто вычисления с float’ом работают раза в 2 медленнее чем с int’ом, а точность большая не нужна.
V>>Дело в том что напрягает загрузка процессора, т.к. это дело в многократно вызываемом цикле.
V>>Может есть какой-нить алгоритм на асме пошустрее? Или может какой-нить совет по настройкам оптимизации проекта. Интересны все предложения.
LY>Сильно зависит от вида процессора, на x86 процессор имеет команду сохраниния float в int, при этом автоматически и бысто делает округление к ближайщему целому. Но по правилам C/C++ преобразование float в int должно выполняться с усечением. Поэтому i=(int)f выполняется отдельной библиотечной функцией, которая сохраняет режим FPU, меняет его режим округления на уселечение, сохраняет float в int и восстанавливает режим FPU. Сделать быстрее можно только через inline-assembler (будет равносильно i=(int)(f + .5)). Синтаксис зависит от компилятора, см. команды fld, fistp и fist.
V>>И ещё вопрос:
V>>Что быстрее
V>>a=i*256; V>>
V>>a=i>>8; V>>
Re[3]: Подскажите как быстро преобразовать float в int.
| От: | ned |
| Дата: | 29.06.06 11:46 |
| Оценка: |
Здравствуйте, Сергей Мухин, Вы писали:
S>>Сдвиг быстрей.
СМ>с какого испуга?
СМ>посмотри генерацию (при вкл оптим).
Так, так. Какой компилятор, платформа?
У меня в обоих случаях компилятор генерит сдвиг.
Команда shl выполнятся всего несколько тактов, а mul намного дольше.
Re[4]: Подскажите как быстро преобразовать float в int.
| От: | Sh1ZoID | http://vkontakte.ru/id6263850 |
| Дата: | 29.06.06 11:59 | |
| Оценка: |
Здравствуйте, ned, Вы писали:
ned>Здравствуйте, Сергей Мухин, Вы писали:
S>>>Сдвиг быстрей.
СМ>>с какого испуга?
СМ>>посмотри генерацию (при вкл оптим).
ned>У меня в обоих случаях компилятор генерит сдвиг.
Дык о том и речь
Re: Подскажите как быстро преобразовать float в int.
| От: | vvotan |
| Дата: | 29.06.06 13:03 |
| Оценка: |
Здравствуйте, Voit, Вы писали:
V>Возможно ли более быстро сделать данное преобразование?