Convert commas decimal separators to dots within a Dataframe
I am importing a CSV file like the one below, using pandas.read_csv :
Example of CSV file:
The problem is that when I later on in my code try to use these values I get this error: TypeError: can’t multiply sequence by non-int of type ‘float’
The error is because the number I’m trying to use is not written with a dot ( . ) as a decimal separator but a comma( , ). After manually changing the commas to a dots my program works.
I can’t change the format of my input, and thus have to replace the commas in my DataFrame in order for my code to work, and I want python to do this without the need of doing it manually. Do you have any suggestions?
5 Answers 5
pandas.read_csv has a decimal parameter for this: doc
![]()
I think the earlier mentioned answer of including decimal=»,» in pandas read_csv is the preferred option.
However, I found it is incompatible with the Python parsing engine. e.g. when using skiprow= , read_csv will fall back to this engine and thus you can’t use skiprow= and decimal= in the same read_csv statement as far as I know. Also, I haven’t been able to actually get the decimal= statement to work (probably due to me though)
The long way round I used to achieving the same result is with list comprehensions, .replace and .astype . The major downside to this method is that it needs to be done one column at a time:
Now, column a will have float type cells. Column b still contains strings.
Note that the .replace used here is not pandas’ but rather Python’s built-in version. Pandas’ version requires the string to be an exact match or a regex.
Преобразование запятых в точки в Dataframe
Проблема в том, что когда я позже в моем коде попытаюсь использовать эти значения, я получаю эту ошибку: TypeError: не может умножить последовательность на non-int типа ‘float’.
Я получаю эту ошибку, потому что число, которое я пытаюсь использовать, не написано с точкой (.) как разделитель десятичной дроби, а запятой (,). После ручной смены запятых на точки, которые выполняет моя программа.
Я не могу изменить формат ввода и, следовательно, должен заменить запятые в моем DataFrame, чтобы мой код работал, и я хочу, чтобы python сделал это без необходимости делать это вручную. У вас есть предложения?
3 ответа
pandas.read_csv имеет параметр decimal для этого: doc
Я думаю, что ранее упомянутый ответ включения decimal=»,» в pandas read_csv является предпочтительным вариантом.
Однако я обнаружил, что он несовместим с механизмом синтаксического анализа Python. например при использовании skiprow= read_csv вернется к этому движку, и поэтому вы не можете использовать skiprow= и decimal= в том же самом read_csv, насколько я знаю. Кроме того, мне не удалось заставить оператор decimal= работать (возможно, из-за меня)
Длинный путь, который я использовал для достижения такого же результата, — это списки, .replace и .astype . Основной недостаток этого метода заключается в том, что он должен выполняться по одному столбцу за раз:
Теперь столбец a будет иметь ячейки типа float. Столбец b все еще содержит строки.
Обратите внимание, что используемый здесь .replace не pandas ‘, а встроенная версия Python. pandas ‘требует, чтобы строка была точным совпадением или регулярным выражением.
Python-сообщество
Доброе время!
Есть строки с числами 2095,51 209,56 1885,95. Чтобы преобразовать их во float необходимо запятую изменить на точку. Подскажите пожалуйста оптимальное решение. подозреваю, что через format, но так и не понял.
#2 Ноя. 9, 2017 11:19:06
Преобразование числа с запятой
#3 Ноя. 9, 2017 11:42:32
Преобразование числа с запятой
Как можно оптимизировать код в первых трех строках, даже мне глаз режет
Отредактировано megafox (Ноя. 9, 2017 11:49:35)
#4 Ноя. 9, 2017 11:43:27
Преобразование числа с запятой
Отредактировано FishHook (Ноя. 9, 2017 11:43:43)
#5 Ноя. 9, 2017 13:32:48
Преобразование числа с запятой
megafox а что вам мешает сразу заменить , на. и уже получить готовые для обработки данные
#6 Ноя. 10, 2017 14:27:48
Преобразование числа с запятой
Очередной привет )
Продолжу здесь, чтобы не спамить.
Задача: есть файл, разделенный на блоки пустой строкой, каждый из них начинается словом “Абонентский номер” и заканчивается “Итого”. Задача пробежаться по строкам и вытащить из них значения, создав второй файл с данными Абонентский номер xxx.
Натолкните на мысль пожалуйста как сделать так, чтобы при нахождении слова Абонентский начиналась обработка блока до слова Итого или пустой строки, происходила запись в файл и начиналась обработка следующего блока.
пример блока:
По услугам в соответствии с тарифным планом “Фирменный Универсальный”
Абонентский номер +7XXXXXXXXXX
Безлимитный внутри сети лайт() 81
Входящие вызовы (Остальные)( мин) 1,15 0
Входящие вызовы (С мобильного)( мин) 84,10 0
Опция Безлимитный интернет( Мб) 167,4
Итого 307,97
#7 Ноя. 10, 2017 15:54:26
Преобразование числа с запятой
Отредактировано vic57 (Ноя. 10, 2017 17:22:26)
#8 Ноя. 10, 2017 17:21:18
Преобразование числа с запятой
я думаю уже блоки сами сможете обработать. как пример блоки отличаются номером:
[django] Как сделать разделителем точку вместо запятой в float?
В шаблоне использую переменную << float_var >>, джанго всталяет число с разделителем запятая (наверно локализует автоматически по тегам мета, где язык прописан), а мне для использования в JS нужна точка (т.е. вместо 35,7 35.7). Сейчас преобразую с помощью JS:
вместо того, чтобы сделать так:
Получается костыль, который не радует глаз + генерирется куча мусора. Как задать принудительно разделителем точку?