2013-06-26 4 views
2

Если я создаю DataFrame, где один столбец является объектом, а другой является целым числом, поместите этот DataFrame в словарь, а затем используйте этот словарь для создания панели, тип целочисленных данных исчезнет:pandas сохранить тип данных при создании панели

import pandas as pd 
import datetime as dt 

a=['a' for i in range(1000)] 
b=[i for i in range(1000)] 
c = {'c':a[:], 'b':b[:]} 
df = pd.DataFrame(c) 

print df 

d = dict() 
d['x'] = df 
p = pd.Panel(d) 

print p['x'] 

Выход:

<class 'pandas.core.frame.DataFrame'> 
Int64Index: 1000 entries, 0 to 999 
Data columns (total 2 columns): 
b 1000 non-null values 
c 1000 non-null values 
dtypes: int64(1), object(1) 
<class 'pandas.core.frame.DataFrame'> 
Int64Index: 1000 entries, 0 to 999 
Data columns (total 2 columns): 
b 1000 non-null values 
c 1000 non-null values 
dtypes: object(2) 

есть ли способ сохранения типов данных при создании панели из DataFrame содержащего словарь?

+0

Я борюсь с этой же проблемой, вы нашли какое-либо решение для этого? – mikkom

+0

Не совсем :(Ближайший я пришел, снова установил тип позже (см. Мой комментарий к одному из ответов ниже). –

+0

Я думаю, что проблема связана с самой панелью (я добавил одно возможное [плохое решение] в качестве ответа ниже) Я реструктурировал свои данные и перешел к типу данных, которые подходят для моих нужд. – mikkom

ответ

0

Они должны быть в отдельных кадрах, чтобы избежать объединения типов. Вот один из способов

In [52]: df = pd.DataFrame(c) 

In [53]: df 
Out[53]: 
<class 'pandas.core.frame.DataFrame'> 
Int64Index: 1000 entries, 0 to 999 
Data columns (total 2 columns): 
b 1000 non-null values 
c 1000 non-null values 
dtypes: int64(1), object(1) 

In [54]: df['x'] = 'x' 

In [55]: df['y'] = range(len(df)) 

In [56]: p = df.set_index(['x','y']).to_panel() 

In [10]: p['b'] 
Out[10]: 
<class 'pandas.core.frame.DataFrame'> 
Index: 1 entries, x to x 
Columns: 1000 entries, 0 to 999 
dtypes: int64(1000) 

In [11]: p['c'] 
Out[11]: 
<class 'pandas.core.frame.DataFrame'> 
Index: 1 entries, x to x 
Columns: 1000 entries, 0 to 999 
dtypes: object(1000) 
+0

Я не совсем уверен, что вы пытаетесь показать здесь. В конце я хочу, чтобы столбцы на панели имели один и тот же тип как в исходном DataFrame (int64 и object) .Как работать, я просто устанавливаю их с помощью 'p ['x'] ['b'] = p ['x'] ['b']. astype (float) 'и, похоже, это работает. –

+0

извините .... swapaxes не предназначался для того, чтобы быть там, отредактировал решение – Jeff

2

Ответ заключается в том, что нет никакого способа сделать это, если вы не измените ориентацию.

В докладе ошибки, которая объясняет этот вопрос здесь: https://github.com/pydata/pandas/issues/359

цитирует соответствующую часть ниже:

в приведенном ниже примере, «а» представляет собой смешанный тип dataframe. После того, как включено в Группа, все столбцы становятся объекта типа:

[..]

Панель может быть только гетерогенным в деталях. Я просто добавил опцию сориентировать на панель, так что вы можете сделать:

In [4]: panel = Panel.from_dict({'1':a,'2':b}, orient='minor') 

In [5]: panel 
Out[5]: 
<class 'pandas.core.panel.Panel'> 
Dimensions: 3 (items) x 30 (major) x 2 (minor) 
Items: a to c 
Major axis: 0 to 29 
Minor axis: 1 to 2 

In [6]: panel['a'].values.dtype 
Out[6]: dtype('float64') 

In [7]: panel['b'].values.dtype 
Out[7]: dtype('object') 

In [8]: panel['c'].values.dtype 
Out[8]: dtype('float64')