Почему pd.to_numeric не работает с большими числами? - PullRequest
0 голосов
/ 03 января 2019

Допустим, у меня есть большое число в строке, например '555555555555555555555'.Можно преобразовать его в тип int, float или даже numpy:

int('555555555555555555555')
float('555555555555555555555')
np.float('555555555555555555555')

Однако, когда я использую функцию панд pd.to_numeric, все идет не так:

pd.to_numeric('555555555555555555555')

С ошибкой:

Traceback (most recent call last):
  File "pandas/_libs/src/inference.pyx", line 1173, in pandas._libs.lib.maybe_convert_numeric
ValueError: Integer out of range.

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "C:\path_to_conda\lib\site-packages\IPython\core\interactiveshell.py", line 3267, in run_code
    exec(code_obj, self.user_global_ns, self.user_ns)
  File "<ipython-input-34-6a735441ab7b>", line 1, in <module>
    pd.to_numeric('555555555555555555555')
  File "C:\path_to_conda\lib\site-packages\pandas\core\tools\numeric.py", line 133, in to_numeric
    coerce_numeric=coerce_numeric)
  File "pandas/_libs/src/inference.pyx", line 1185, in pandas._libs.lib.maybe_convert_numeric
ValueError: Integer out of range. at position 0

Что не так?Почему панды to_numeric не могут обрабатывать большие значения?Есть ли случаи использования, по которым вы бы использовали pd.to_numeric вместо таких функций, как np.float?

1 Ответ

0 голосов
/ 03 января 2019

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

In [4]: import sys

In [5]: sys.maxsize
Out[5]: 9223372036854775807

In [6]: 555555555555555555555 > sys.maxsize
Out[6]: True

Вот часть исходного кода который поднимает ValueError:

if not (seen.float_ or as_int in na_values):
    if as_int < oINT64_MIN or as_int > oUINT64_MAX:
        raise ValueError('Integer out of range.')

Как видите, поскольку ваш номер не является числом с плавающей точкой, он обрабатывает его как целое число и проверяет, находится ли число в правильном диапазоне oINT64_MIN, oUINT64_MAX.Если вы вместо этого передали число с плавающей точкой, это дало бы вам правильный результат:

In [9]: pd.to_numeric('555555555555555555555.0')
Out[9]: 5.5555555555555554e+20
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...