为什么 pandas 将大于 2**63-1 的 unsigned int 转换为对象?
Why does pandas convert unsigned int greater than 2**63-1 to objects?
当我将 numpy 数组转换为 pandas 数据框时,如果整数大于 2^63 - 1,pandas 会将 uint64 类型更改为对象类型。
import pandas as pd
import numpy as np
x = np.array([('foo', 2 ** 63)], dtype = np.dtype([('string', np.str_, 3), ('unsigned', np.uint64)]))
y = np.array([('foo', 2 ** 63 - 1)], dtype = np.dtype([('string', np.str_, 3), ('unsigned', np.uint64)]))
print pd.DataFrame(x).dtypes.unsigned
dtype('O')
print pd.DataFrame(y).dtypes.unsigned
dtype('uint64')
这很烦人,因为我无法将数据帧写入 table 格式的 hdf 文件:
pd.DataFrame(x).to_hdf('x.hdf', 'key', format = 'table')
输出:
TypeError: 无法序列化列 [unsigned] 因为
它的数据内容是 [integer] object dtype
谁能解释一下类型转换?
x = np.array([('foo', 2 ** 63)],
dtype = np.dtype([('string', np.str_, 3),
('unsigned', 'f4')]))
y = np.array([('foo', 2 ** 63 - 1)],
dtype = np.dtype([('string', np.str_, 3),
('unsigned', 'i8')]))
这是一个 open bug, but you can force it back to an uint64
using DataFrame.astype()
x = np.array([('foo', 2 ** 63)], dtype = np.dtype([('string', np.str_, 3), ('unsigned', np.uint64)]))
a = pd.DataFrame(x)
a['unsigned'] = a['unsigned'].astype(np.uint64)
>>>a.dtypes
string object
unsigned uint64
dtype: object
用于将数据类型转换为数值的其他方法引发错误或无效:
>>>pd.to_numeric(a['unsigned'], errors = coerce)
OverflowError: Python int too large to convert to C long
>>>a.convert_objects(convert_numeric = True).dtypes
string object
unsigned object
dtype: object
当我将 numpy 数组转换为 pandas 数据框时,如果整数大于 2^63 - 1,pandas 会将 uint64 类型更改为对象类型。
import pandas as pd
import numpy as np
x = np.array([('foo', 2 ** 63)], dtype = np.dtype([('string', np.str_, 3), ('unsigned', np.uint64)]))
y = np.array([('foo', 2 ** 63 - 1)], dtype = np.dtype([('string', np.str_, 3), ('unsigned', np.uint64)]))
print pd.DataFrame(x).dtypes.unsigned
dtype('O')
print pd.DataFrame(y).dtypes.unsigned
dtype('uint64')
这很烦人,因为我无法将数据帧写入 table 格式的 hdf 文件:
pd.DataFrame(x).to_hdf('x.hdf', 'key', format = 'table')
输出:
TypeError: 无法序列化列 [unsigned] 因为 它的数据内容是 [integer] object dtype
谁能解释一下类型转换?
x = np.array([('foo', 2 ** 63)],
dtype = np.dtype([('string', np.str_, 3),
('unsigned', 'f4')]))
y = np.array([('foo', 2 ** 63 - 1)],
dtype = np.dtype([('string', np.str_, 3),
('unsigned', 'i8')]))
这是一个 open bug, but you can force it back to an uint64
using DataFrame.astype()
x = np.array([('foo', 2 ** 63)], dtype = np.dtype([('string', np.str_, 3), ('unsigned', np.uint64)]))
a = pd.DataFrame(x)
a['unsigned'] = a['unsigned'].astype(np.uint64)
>>>a.dtypes
string object
unsigned uint64
dtype: object
用于将数据类型转换为数值的其他方法引发错误或无效:
>>>pd.to_numeric(a['unsigned'], errors = coerce)
OverflowError: Python int too large to convert to C long
>>>a.convert_objects(convert_numeric = True).dtypes
string object
unsigned object
dtype: object