2015-09-04 161 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