Ошибка при попытке конвертировать Object в Float в python - PullRequest
2 голосов
/ 02 октября 2019

У меня есть файл, который перечисляет остатки на депозитах в виде строк. Чтобы построить эти числа, я пытаюсь преобразовать объекты в число с плавающей точкой. Поэтому я написал код для удаления $ и удаления пробелов до и после значений.

member_clean.TotalDepositBalances = member_clean.TotalDepositBalances.str.replace('$', '')

member_clean['TotalDepositBalances'] = member_clean['TotalDepositBalances'].str.strip()

member_clean['TotalDepositBalances'] = member_clean['TotalDepositBalances'].astype(float)

Когда я запускаю код, я получаю сообщение об ошибке, которое говорит

ValueError: могли быне конвертировать строку в число с плавающей точкой:

Вот и все. До того, как я добавил str.strip, сообщение об ошибке показывало, что в некоторых значениях есть пробелы до и после, поэтому я знал, что их нужно удалить. Но я немного запутался, что еще вызывает это,

Я посмотрел значения столбца после того, как убрал пробелы и $, и все выглядит нормально. Вот образец.

  1. 309,00
  2. 38,00
  3. 12 486,00
  4. 6,108,00
  5. 2,537,00

Любые идеи о том, что я мог бы проверить в столбцах, которые могут вызывать эту ошибку

Ответы [ 2 ]

3 голосов
/ 02 октября 2019

Вы должны удалить запятые, они не являются числовым форматом, распознаваемым Python. Поэтому, учитывая список, который вы дали как возможный ввод:

str_num = ['309.00 ', ' 38.00 ', ' 12,486.00 ', '6,108.00', ' 2,537.00']

, вы должны сделать это:

list(map(lambda s: float (s.replace (',', '')), str_num))

, и вы получите свой список с плавающей точкой:

[309.0, 38.0, 12486.0, 6108.0, 2537.0]

Примечание : вам не нужно делать str.strip(), потому что пробелы автоматически удаляются из операции приведения с плавающей точкой.

Следуя вашему конвейеру, перед преобразованием в float, вам нужно сделать:

member_clean['TotalDepositBalances'] = member_clean['TotalDepositBalances'].str.replace(',', '')

Или вы можете запустить весь конвейер в одну строку кода следующим образом:

member_clean['TotalDepositBalances'] = member_clean['TotalDepositBalances'].replace('$', '').replace(',', '').astype(float)

Дополнительно: Производительность

Здесь вынайдет тесты, которые представляют сравнение различных методов для выполнения множественных замен, вставленных в строку. Удивительно использовать replace в каскаде (как в вашем конвейере), он оказывается более эффективным, чем регулярное выражение для этого типа операций. Дайте ему чтение.

0 голосов
/ 02 октября 2019

Полезный метод для работы с большими наборами данных или рядами - создать словарь поиска исправленных значений, чтобы повторные значения не пересчитывались:

import pandas as pd
import re

def fast_num_conversion(s):
    """
    This is an extremely fast approach to parsing messy numbers to floats.
    For large data, the same values are often repeated. Rather than
    re-parse these, we store all unique dates, parse them, and
    use a lookup to convert all figures. 
    (Should be 10X faster than without lookup dict)

       Note, input must be a pandas series.
    """
    f_convert = lambda x: re.sub('[$\-,\| ]', '', x)
    f_float = lambda x: float(x) if x!='' else np.NaN
    vals = {curr:f_float(f_convert(curr)) for curr in s.unique()}
    return s.map(vals)

str_num = ['309.00', '38 .00 ', '12, 486.00', '6,108.00', '2,537.00']

print(pd.Series(fast_num_conversion))
0      309.0
1       38.0
2    12486.0
3     6108.0
4     2537.0
...