2013-07-30 27 views
2

Мне нужно создать DataFrame, который содержит столбцы DataFrames. DataFrames, которые идут в колонке, имеют разные размеры, и я получаю исключение StopIteration. Этого не происходит, когда DataFrames имеют одинаковый размер. Я знаю, что Panel больше подходит для этого, но в этом случае мне нужен DataFrame.Pandas: DataFrame в DataFrame

a=pd.DataFrame({'cat1':['one','two','three'],'cat2':['four','five','six']}) 
b=pd.DataFrame({'cat1':['ten','eleven'],'cat2':['twelve','thirteen']}) 
pd.DataFrame({'col1':{'row1':a,'row2':b}}) 

Если я удалить «три» и «шесть» элементов из «cat1», «CAT2» соответственно, то это работает отлично. Любая идея, как я могу это достичь?

+0

Я не видел упоминание о DataFrame из DataFrame-й в «Python для анализа данных» книга панд автора. Какова ваша конечная цель? –

+0

У меня есть список ценных бумаг, идущих вниз и куча полей. Некоторые из этих полей приводят к таблице (то есть списку держателей или истории дивидендов), и я хотел объединить это со скалярными значениями (цена, изменение pct, имя и т. Д.). У меня уже есть панель, но мне хотелось иметь один вид всей таблицы. Это просто с тем, чтобы иметь возможность обобщать подход в коде, т. Е. Я всегда могу использовать DF.ix ['security', 'field'] независимо от формы поля. Думаю, единственный правильный способ - сделать это с помощью панели [security] [field]. Я просто пытался добиться успеха. –

ответ

1

Это не очень хорошая идея, вы теряете всю эффективность, потому что все вещи обрабатываются как d1200, а операции будут довольно медленными (так как операции не могут выполняться с помощью базовых типов c-level, таких как float/int). Лучше использовать индекс многоуровневого, который легко может охватить то, что я думаю, что вы хотите

In [20]: a 
Out[20]: 
    cat1 cat2 
0 one four 
1 two five 
2 three six 

In [21]: b 
Out[21]: 
    cat1  cat2 
0  ten twelve 
1 eleven thirteen 

In [22]: pd.concat([ a, b ], keys={ 'row1' : a, 'row2' : b }) 
Out[22]: 
      cat1  cat2 
row1 0  one  four 
    1  two  five 
    2 three  six 
row2 0  ten twelve 
    1 eleven thirteen 
+0

Существует также возможность создания иерархически индексированного 'DataFrame' с использованием' Panel.to_frame (filter_observations = False) '. –

+0

Спасибо, Джефф. Идея сделать это состоит в том, что мне нужно объединить эти кадры данных с другой связью скалярных значений. Например row1: DF_a, np.nan, 104, 105 | row2: np.nan, DF_b, 234, 213. Это предполагает, что у меня есть столбцы Cat1, Cat2, Scalar1, Scalar2. Я предполагаю, что это все еще возможно с использованием подхода с несколькими индексами, мне просто нужно будет транслировать скалярное значение по всем элементам cat1/cat2? Еще раз спасибо –

+0

вам не обязательно быть фантазией '' df ['scalar1'] = 234'' будет работать – Jeff