#python #python-3.x #string #dataframe #floating-point
#питон #python-3.x #строка #фрейм данных #с плавающей запятой #python
Вопрос:
Я пытаюсь преобразовать строку, которая похожа на «8,191.55 МБ», в «8191,55», чтобы я мог разделить ее на 1024, чтобы получить ее в гигабайтах.
Код, который я пытаюсь использовать, выдает мне «819155» вместо «8191.55».
Код :
TotalRAM = dfHandler['Total Physical Memory'].values[0]
TotalRAM = (int)(''.join(i for i in TotalRAM if i.isdigit()))
Комментарии:
1. Ваш оператор join избавляется от десятичного знака. Возможно, вы захотите заменить все нечисловые символы на ‘, а затем выполнить преобразование с плавающей запятой. Кроме того, вы хотите использовать float, а не int. Int округлит до ближайшего целого числа и избавится от ваших десятичных знаков.
2. В этом случае вы можете обойти это, но в целом вы можете захотеть изучить регулярные выражения: docs.python.org/3/library/re.html
Ответ №1:
Используйте replace()
, чтобы избавиться от значений запятой, и используйте split()
, чтобы разбить ее на части. Функция разделения также избавит от начального и конечного пробелов.
RAM = ' 8,191.55 MB '
ram_in_MB = float(RAM.replace(',','').split()[0])
print(ram_in_MB)
# 8191.55
Ответ №2:
Учитывая имеющийся у вас код, я бы выбрал
TotalRAM = dfHandler['Total Physical Memory'].values[0]
TotalRAM = float(''.join(i for i in TotalRAM if (i.isdigit() or i == ".")))
Ответ №3:
TotalRAM = dfHandler['Total Physical Memory'].values[0]
TotalRAM = float(TotalRAM.replace(',', '').replace(' MB', ''))
TotalRAMGb = TotalRam / 1024
Ответ №4:
Я бы использовал регулярные выражения (re) для извлечения числовой части вашей строки. Он получит числа (d ) и десятичные дроби (.).
import re
num = re.findall("(d (?:.d )?)", "8,191.55 MB")
print(float(''.join(num)))
Результат:
8191.55
Комментарии:
1. Ваше регулярное выражение неверно — не учитывало запятые или числа без десятичных дробей
2. вам не нужны запятые, потому что число с плавающей запятой не принимает запятые. Я отредактировал свой ответ, чтобы обрабатывать целочисленные значения. Спасибо.
Ответ №5:
Как насчет более локализованного подхода:
from locale import setlocale, LC_NUMERIC, atof
setlocale(LC_NUMERIC, '')
# ...
TotalRAM = dfHandler['Total Physical Memory'].values[0]
TotalRAM = atof(TotalRAM.split()[0])