2014-09-01 12 views
21

chcę przynieść dane do DataFrame pandy i chcę przypisać dtypes dla każdej kolumny z importu. Chcę być w stanie to zrobić w przypadku większych zbiorów danych z wielu kolumn, ale jako przykład:Jak ustawić dtypes przez kolumnę w Pandy DataFrame

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

wyniki:

TypeError: data type not understood 

Próbowałem kilka innych metod, takich jak:

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

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

Jeśli wstawię dtype=(float,int), zastosuje on format float do obu kolumn.

Na koniec chciałbym tylko móc go przekazać listę typów danych w ten sam sposób mogę to lista nazw kolumn Pass.

+0

Argument 'dtype' powinien być ważny dtype numpy (i dtypes strukturyzowane nie są obsługiwane), więc lista lub dict nie będzie działać. Możliwym sposobem jest wykonanie atrapy dla każdej kolumny osobno. Lub najpierw utwórz strukturę numpy array i przekaż ją do DataFrame. – joris

+0

Wiedziałem, że mogę przypisać każdy indywidualnie w pętli, ale jestem zaskoczony dtype = nie był wystarczająco elastyczny, aby pomieścić listę. Dzięki za odpowiedź choć dobry, aby uzyskać potwierdzenie :) – Chris

+2

https://github.com/pydata/pandas/issues/4464 jest obecnie kwestią otwartą do tego (jeśli chcesz zrobić żądania ściągania byłoby świetnie) – Jeff

Odpowiedz

10

po prostu wpadł na to, a problem pandy jest nadal otwarta, więc jestem delegowania mój obejścia. Zakładając df jest mój DataFrame i dtype jest odwzorowaniem DICT nazwy kolumn typów:

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

(uwaga: używać dtype.iteritems() w Pythonie 2)

na odniesienie:

+1

zaskoczony, że nie ma sposobu na to jeszcze w Pandy Byłby dobry PR myślę – Chris

+3

Muszę użyć 'dla k, v w dtype.iteritems():' do tego do pracy. – Khris

+0

To można zmienić na 'df.astype (typ dtype) – DJK

3

Możesz spróbować przechodzącą w słowniku Series obiektów do konstruktora DataFrame - to daje dużo bardziej specyficzne kontrolę nad tworzeniem i mam nadzieję, że lepiej będzie wyjaśnić, co się dzieje. Wersja szablonu (data1 może być tablicą itd.):

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

i Przykład z danymi:

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 
Powiązane problemy