我正在设计一个清理第三方提交的非常混乱的数据的工作流程,
我遇到了数字转换问题。具体来说,我正在使用
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
答案 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