2014-09-01 44 views
21

Bazı verileri bir DataFrame pandasına getirmek istiyorum ve içe aktarma sırasında her bir sütun için dtypes atamak istiyorum.Pandalarda sütuna göre dtypes nasıl ayarlanır DataFrame

:
TypeError: data type not understood 

ben gibi birkaç başka yöntemler denedik: içinde

myarray = np.random.randint(0,5,size=(2,2)) 
mydf = pd.DataFrame(myarray,columns=['a','b'], dtype=[float,int]) 
mydf.dtypes 

sonuçları: Ben bir örnek olarak, birçok farklı sütunlu büyük veri kümeleri için bunu yapmak isterler, fakat

mydf = pd.DataFrame(myarray,columns=['a','b'], dtype={'a': int}) 

TypeError: object of type 'type' has no len() 

dtype=(float,int)'u koyarsam her iki sütuna da bir float formatı uygular.

Sonuçta, sadece bir dizi sütun ismini okuyabildiğim gibi bir veri türü listesi vermek istiyorum.

+0

dtype' geçerli numpy d_type olmalıdır (ve yapısal dtypes desteklenmez 'için bağımsız değişken), bu yüzden liste veya dict işe yaramaz. Her bir sütun için astipi ayrı ayrı yapmak ayrı bir yoldur. Ya da önce yapısal bir numpy dizisi yapın ve bunu DataFrame'e verin. – joris

+0

Her bir döngüyü ayrı ayrı atayabileceğimi biliyordum, ancak şaşırdım dtype = bir listeyi alacak kadar esnek değildi. Cevabınız için teşekkürler, onay almak için iyi :) – Chris

+2

https://github.com/pydata/pandas/issues/4464 şuan için bu açık bir sorundur (eğer bir çekme isteği yapmak istiyorsanız harika olurdu) – Jeff

cevap

10

Sadece buna rastladım ve pandalar sorunu hala açık, bu yüzden geçici çözümümü gönderiyorum. df varsayarsak benim DataFrame ve dtype türlerine dict haritalama sütun isimleri:

for k, v in dtype.items(): 
    df[k] = df[k].astype(v) 

(not: piton 2'de dtype.iteritems() kullanın) Referans için

:

+1

Bu Pandas için henüz bir yöntem yok Şaşırmışlar Ben düşünmek iyi bir PR olurdu – Chris

+3

Ben çalışmak için bunun için, dtype.iteritems(): 'k için v kullanmanız gerekir.Onun çalışması için – Khris

+0

Bu df.astype (dtype)' olarak değiştirilebilir – DJK

3

Sen DataFrame kurucusuna Series nesnelerin sözlükte geçen denemek isteyebilirsiniz - bu yaratılış üzerinde çok daha spesifik kontrol verecek ve umarım neyin olup bittiğini daha açık olmalı. verilerle

df = pd.DataFrame({'column1':pd.Series(data1, dtype='type1'), 
        'column2':pd.Series(data2, dtype='type2')}) 

ve örneğin: bir şablon versiyonu (data1 bir dizi vs. olabilir)

df = pd.DataFrame({'A':pd.Series([1,2,3], dtype='int'), 
        'B':pd.Series([7,8,9], dtype='float')}) 

print (df) 
    A B 
0 1 7.0 
1 2 8.0 
2 3 9.0 

print (df.dtypes) 
A  int32 
B float64 
dtype: object 
İlgili konular