为什么pd.to_numeric不能用于大数?

时间:2019-01-03 09:27:01

标签: python pandas numpy

假设我的字符串中有很多数字,例如'555555555555555555555'。可以选择将其转换为int,float或numpy float:

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

但是,当我使用pandas函数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 :(得分:6)

因为您的数字大于系统可以保存的整数的最大大小:

In [4]: import sys

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

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

这里是the source code的一部分,引起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