pandas to_numeric errors =' coerce'在int64之外的数字时不会强制执行

时间:2018-03-07 13:51:39

标签: python pandas casting

我正在设计一个清理第三方提交的非常混乱的数据的工作流程, 我遇到了数字转换问题。具体来说,我正在使用 pandas.to_numeric获取作为文本接收和存储的数据,以及 测试它是否包含有效数字。 (是的,我知道这会更容易 尽早清理用户输入,但遗憾的是不可能 在这种情况下。)

我遇到的问题是pandas.to_numeric似乎无声地失败 当遇到+/- 2 ^ 64大小范围之外的整数时。 这是 预期的行为?

如果是预期的行为,有没有办法以编程方式解决它? 我发现它正确地强制了2 ^ 64之外的数值 限制,但不是整数。

这里只是一个有问题的组件的最小例子:

import pandas
# when converting text representations of numbers to 
# numbers, the conversion fails if the number is very 
# large (~2^64)
integer_version_success = pandas.to_numeric(
    pandas.Series(
        name = 'values',
        index = range(2),
        # works even when adding a bit beyond 2^64
        data = ['9223372036854775807','.50001']), 
    errors='coerce')

print(integer_version_success)
# 0    9.223372e+18
# 1    5.000100e-01
# Name: values, dtype: float64

integer_version_failure = pandas.to_numeric(
    pandas.Series(
        name = 'values',
        index = range(2),
        # one digit longer, outside range
        data = ['92233720368547758071','.50001']), 
    errors='coerce')

print(integer_version_failure)
# 0    92233720368547758071
# 1                  .50001
# Name: values, dtype: object
#  | bad, leads to unexpected results

# when converting text representations of numbers to numbers, 
# the conversion succeeds if the number is already represented 
# as a number (non-int), regardless of if it's larger than 2^64
numeric_version_success = pandas.to_numeric(
    pandas.Series(
        name = 'values',
        index = range(2),
        # one digit longer, outside range  
        data = ['92233720368547758071.0','.50001']), 
    errors='coerce')

print(numeric_version_success)
# 0    9.223372e+19
# 1    5.000100e-01
# Name: values, dtype: float64 
#   | putting a decimal in the string maxes coercion succeed

1 个答案:

答案 0 :(得分:0)

这是由于0.20.3中的问题,在0.22.0上运行时已解决。

documentation没有说coerce会引发异常(它会将那些设置为NaN,如果需要可以稍后删除),您可以将其更改为raise或者不要&# 39; t将其设置为raise是默认值。

使用pandas 0.22.0:

0    9.223372e+18
1    5.000100e-01
Name: values, dtype: float64
0        NaN
1    0.50001
Name: values, dtype: float64
0    9.223372e+19
1    5.000100e-01
Name: values, dtype: float64