2015-09-04 6 views
0

У меня есть ряд панд, который выглядит следующим образом: куча unicode строкПанда Datatype Проблема преобразование

>>> 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

UPDATE: Я нашел ошибку. some_id.astype(int) или любая другая его форма должна работать. Где-то по тысячам строк у меня есть, у some_id есть stringтекст (не строка номер ed), поэтому он остановил преобразование 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 

Просто co nverting с использованием .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