2016-06-30 3 views
3

Я использую панда (v0.18.1) импортировать следующие данные из файла под названием «test.csv»:панда read_csv колонка DTYPE установлена ​​десятичной, но преобразует в строку

a,b,c,d 
1,1,1,1.0 

Я установить dtype to 'decimal.Decimal' для столбцов 'c' и 'd', но вместо этого они возвращаются как type 'str'.

import pandas as pd 
import decimal as D 

df = pd.read_csv('test.csv', dtype={'a': int, 'b': float, 'c': D.Decimal, 'd': D.Decimal}) 

for i, v in df.iterrows(): 
    print(type(v.a), type(v.b), type(v.c), type(v.d)) 

Результаты:

`<class 'int'> <class 'float'> <class 'str'> <class 'str'>` 

Я также попытался преобразовать в десятичную явно после импорта без везения (преобразующие плавать работает, но не десятичную).

df.c = df.c.astype(float) 
df.d = df.d.astype(D.Decimal) 
for i, v in df.iterrows(): 
    print(type(v.a), type(v.b), type(v.c), type(v.d)) 

Результаты:

`<class 'int'> <class 'float'> <class 'float'> <class 'str'>` 

Следующий код преобразует «» к ул «decimal.Decimal», так что я не понимаю, почему панды не ведет себя таким же образом.

x = D.Decimal('1.0') 
print(type(x)) 

Результаты:

`<class 'decimal.Decimal'>` 

ответ

3

Я думаю, что вам нужны конвертеры:

temp=u"""a,b,c,d 
1,1,1,1.0""" 
#after testing replace io.StringIO(temp) to filename 
df = pd.read_csv(io.StringIO(temp), 
       dtype={'a': int, 'b': float}, 
       converters={'c': D.Decimal, 'd': D.Decimal}) 
print (df) 
    a b c d 
0 1 1.0 1 1.0 

for i, v in df.iterrows(): 
    print(type(v.a), type(v.b), type(v.c), type(v.d)) 

<class 'int'> <class 'float'> <class 'decimal.Decimal'> <class 'decimal.Decimal'> 
+1

[pandas' документация 'является уморительно неспецифической о том, каком' dtype' есть] (HTTP: // pandas.pydata.org/pandas-docs/stable/basics.html#dtypes), но поскольку я предполагаю, что реализация в 'pandas' основана на' numpy', [у нас, к счастью, есть 'numpy' docs] (http: // docs.scipy.org/doc/numpy/reference/arrays.dtypes.html). Имейте в виду, что использование общих объектов может быть более неэффективным с точки зрения производительности и памяти, чем с использованием основных 'int' и' float'. –

Смежные вопросы