2016-06-30 13 views
3

I Pandas bin mit (v0.18.1) die folgenden Daten aus einer Datei 'test.csv' genannt importieren:Pandas read_csv Spalte dtype wird auf dezimal aber wandelt in String

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

ich das Set dtype in 'decimal.Decimal' für die Spalten 'c' und 'd', aber sie kehren als Typ 'str' zurück.

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

Ergebnisse:

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

ich auch ohne Glück explizit nach dem Import in Dezimalzahlen konvertieren habe versucht (Umwandlung Werke zu schweben, sondern Dezimalzahlen nicht).

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

Ergebnisse:

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

Der folgende Code konvertiert eine 'str' auf 'decimal.Decimal' so verstehe ich nicht, warum Pandas nicht die gleiche Art und Weise verhalten.

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

Ergebnisse:

`<class 'decimal.Decimal'>` 

Antwort

3

Ich glaube, Sie brauchen Konverter:

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

[Die 'pandas' Dokumentation ist urkomisch unspezifisch über das, was ein' dtype' ist] (http: // pandas.pydata.org/pandas-docs/stable/basics.html#dtypes), aber da ich annehme, dass die Implementierung in 'pandas' auf' numpy' basiert, [haben wir glücklicherweise 'numpy' docs] (http: // docs.scipy.org/doc/numpy/reference/arrays.dtypes.html). Beachten Sie, dass die Verwendung von generischen Objekten leistungsmäßig und speichertechnisch ineffizienter sein kann als die Verwendung von basic "int" und "float". –