2014-09-01 4 views
21

Я хочу привести некоторые данные в pandas DataFrame, и я хочу назначить dtypes для каждого столбца при импорте. Я хочу быть в состоянии сделать это для больших наборов данных с большим количеством различных колонн, но, как пример:Как установить dtypes по столбцу в pandas DataFrame

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

результатов:

TypeError: data type not understood 

Я попробовал несколько других методов, такие как:

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

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

Если я положил dtype=(float,int), он применяет формат поплавка к обоим столбцам.

В конце концов, я хотел бы просто передать ему список типов данных так же, как передать список имен столбцов.

+0

аргументом для 'dtype' должен быть действительным NumPy DTYPE (и структурированный dtypes не поддерживается), поэтому список или dict не будут работать. Возможный способ - сделать астип для каждого столбца отдельно. Или сначала создайте структурированный массив numpy и предоставите это DataFrame. – joris

+0

Я знал, что могу назначить каждый отдельно в цикле, но я удивлен, что dtype = недостаточно гибко, чтобы разместить список. Спасибо за ответ, хотя, хорошо, чтобы получить подтверждение :) – Chris

+2

https://github.com/pydata/pandas/issues/4464 в настоящее время является открытой проблемой для этого (если вы хотите сделать запрос на тягу, было бы замечательно) – Jeff

ответ

10

Я просто столкнулся с этим, и проблема с пандами все еще открыта, поэтому я отправляю свое обходное решение. Предполагая df мой DataFrame и dtype отображение ДИКТ имен столбцов к типам:

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

(примечание: используйте dtype.iteritems() в питоне 2)

Для справки:

+1

Удивленный, у них нет метода для этого в Пандах еще Я бы мог использовать хороший PR, я бы подумал. – Chris

+3

Мне нужно использовать 'для k, v в dtype.iteritems():' для этого нужно работать. – Khris

+0

Это может быть изменено на 'df.astype (dtype)' – DJK

3

Вы можете попробовать переходящий в словаре Series объектов в DataFrame конструктор - это даст вам гораздо более конкретного контроль над созданием и должно быть, яснее, что происходит. Версия шаблона (data1 может быть массивом и т.д.):

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

И пример с данными:

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 
Смежные вопросы