Как удалить и преобразовать строку в число с плавающей запятой (десятичные дроби)?

#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])