2015-07-13 3 views
1

У меня есть uint64 колонки в моей DataFrame, но когда я конвертировать что DataFrame в список питона Dict с помощью DataFrame.to_dict('record'), в чем ранее uint64 получает волшебным образом преобразуется в поплавок:изменения DTYPE при использовании DataFrame.to_dict

In [24]: mid['bd_id'].head() 
Out[24]: 
0    0 
1 6957860914294 
2 7219009614965 
3 7602051814214 
4 7916807114255 
Name: bd_id, dtype: uint64 

In [25]: mid.to_dict('record')[2]['bd_id'] 
Out[25]: 7219009614965.0 

In [26]: bd = mid['bd_id'] 

In [27]: bd.head().to_dict() 
Out[27]: {0: 0, 1: 6957860914294, 2: 7219009614965, 3: 7602051814214, 4: 7916807114255} 

Как я могу избежать этого странного поведения?

обновление

как ни странно, если я использую to_dict() вместо to_dict('records'), то bd_id столбец будет иметь тип Int:

In [43]: mid.to_dict()['bd_id'] 
Out[43]: 
{0: 0, 
1: 6957860914294, 
2: 7219009614965, 
... 

ответ

5

Это потому, что другой столбец имеет поплавок в нем. Более конкретно, to_dict('records') реализован с использованием атрибута values кадра данных, а не самих столбцов, и это реализует «неявное повышение», в вашем случае конвертирование uint64 в float.

Если вы хотите, чтобы обойти эту ошибку, вы можете явно привести ваш dataframe к object типа данных:

df.astype(object).to_dict('record')[2]['bd_id'] 
Out[96]: 7602051814214 

Кстати, если вы используете IPython и вы хотите увидеть, как реализована функция в библиотеке вы можете закрыть ее, положив ?? в конце вызова метода. Для pd.DataFrame.to_dict?? мы видим

... 
    elif orient.lower().startswith('r'): 
     return [dict((k, v) for k, v in zip(self.columns, row)) 
       for row in self.values] 
0

Вы можете использовать этот

from pandas.io.json import dumps 
import json 
output=json.loads(dumps(mid,double_precision=0)) 
Смежные вопросы