我有一个看起来像这样的pandas系列:一堆unicode
字符串
>>> some_id
0 400742773466599424
1 400740479161352192
2 398829879107809281
3 398823962966097921
4 398799036070653952
Name: some_id, dtype: object
我可以做到以下但我失去了精确度。
>>> some_id.convert_objects(convert_numeric=True)
0 4.007428e+17
1 4.007405e+17
2 3.988299e+17
3 3.988240e+17
4 3.987990e+17
Name: some_id, dtype: float64
但如果我some_id.astype(int)
,我会收到以下信息:ValueError: invalid literal for long() with base 10
如何在保留精度的同时将它们转换为int
或int64
类型?
我正在使用Pandas 0.16.2
更新:我发现了这个错误。 some_id.astype(int)
或其他任何形式都应该有效。在我拥有的数千行的某个地方,some_id有string
个文本(不是字符串 ed编号),所以它停止了{{1}转换。
由于
答案 0 :(得分:1)
Dagrha是对的,你应该可以使用:
some_id.astype(np.int64)
那么类型将是:
In[40]: some_id.dtypes
Out[41]:
some_id int64
dtype: object
答案 1 :(得分:0)
原始数字系列:
s = pd.Series([400742773466599424, 400740479161352192, 398829879107809281,
398823962966097921, 398799036070653952], dtype=object)
>>> s
0 400742773466599424
1 400740479161352192
2 398829879107809281
3 398823962966097921
4 398799036070653952
dtype: object
只需使用.astype(int)
进行转换即可。
>>> s.astype(int)
0 400742773466599424
1 400740479161352192
2 398829879107809281
3 398823962966097921
4 398799036070653952
dtype: int64
作为一个有趣的旁注(如@Warren Weckesser和@DSM所指出的),由于浮点表示,您可能会失去精度。例如,int(1e23)表示为99999999999999991611392L。我不确定这是你所提到的精确度,还是你只是谈论显示的精度。
根据上面的示例数据,两个数字将被关闭:
>>> s.astype(np.int64) - s.astype(float).astype(np.int64)
0 0
1 0
2 1
3 1
4 0
dtype: int64