2015-09-04 137 views
0

我有一个熊猫系列,看起来像这样:一堆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

我怎样才能将它们转换为intint64类型,同时保持精度? 我正在使用熊猫0.16.2

更新:我发现了这个错误。 some_id.astype(int)或任何其他形式的应该工作。沿着成千上万行的某处,some_id有string文本(不是字符串编号),所以它正在停止int64转换。

感谢

+1

如果你使用'some_id.astype(np.int64)'会发生什么? – dagrha

+0

你使用的是什么版本的熊猫。鉴于上面的示例数据,我没有任何问题将some_id从对象转换为int(Pandas 0.14.1)。此外,您不会将精度转换为数字,它只是不显示。 – Alexander

+0

@Alexander可能需要升级 - 0.16.2是当前版本:) – MattDMo

回答

0

原始一系列数字:

s = pd.Series([400742773466599424, 400740479161352192, 398829879107809281, 
       398823962966097921, 398799036070653952], dtype=object) 

>>> s 
0 400742773466599424 
1 400740479161352192 
2 398829879107809281 
3 398823962966097921 
4 398799036070653952 
dtype: object 

Simply co颠覆使用.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 
1

Dagrha是正确的,你应该能够使用:

some_id.astype(np.int64) 

类型将为:

In[40]: some_id.dtypes 
Out[41]: 
some_id int64 
dtype: object