2016-03-11 4 views
1

Идея здесь заключается в том, что каждый год я могу создать три блока данных (df1, df2, df3), каждый из которых содержит разные фирмы и цены на акции («фирма» и «цена») являются двумя столбцами в df1 ~ df3). Я хотел бы использовать еще один фрейм данных (с именем «store» ниже) для хранения трех кадров данных каждый год.DataFrame of DataFrames в Python (Pandas)

Вот что я код:

store = pd.DataFrame(list(range(1967,2014)), columns=['year']) 
for year in range(1967,2014): 
    ....some codes that allow me to generate df1, df2 and df3 correctly... 
    store.loc[store['year']==year, 'df1']=df1 
    store.loc[store['year']==year, 'df2']=df2 
    store.loc[store['year']==year, 'df3']=df3 

Я не получаю предупреждение об ошибке или что-нибудь после этого кода. Но в фрейме данных «store» столбцы «df1», «df2» и «df3» являются значениями «NAN».

+0

Что такое 'DataFrame' -' gvkey'? А что такое 'fyear'? Можете ли вы добавить образец 'df1' и желаемый вывод' store'? – jezrael

+0

@ jezrael, я обновил свой код, чтобы сделать его более понятным. – Stephen

+0

Просто основанный на коде, я думаю, вы должны использовать три словаря вместо одного кадра данных. Я лично не буду хранить данные в кадре данных. – Mai

ответ

0

Я думаю, что панды предлагают лучшие альтернативы тому, что вы предлагаете (объяснение ниже).

Для одного есть структура данных pandas.Panel, которая предназначена для таких вещей, как вы здесь.

Однако, как отмечает Уэс МакКинни (автор Панды) в своей книге Python for Data Analysis: Data Wrangling with Pandas, NumPy, and IPython, многомерные индексы в значительной степени предлагают лучшую альтернативу.

Рассмотрим следующую альтернативу к коду:

dfs = [] 
for year in range(1967,2014): 
    ....some codes that allow me to generate df1, df2 and df3 
    df1['year'] = year 
    df1['origin'] = 'df1' 
    df2['year'] = year 
    df2['origin'] = 'df2' 
    df3['year'] = year 
    df3['origin'] = 'df3' 
    dfs.extend([df1, df2, df3]) 
df = pd.concat(dfs) 

Это дает вам DataFrame с 4-мя колонками: 'firm', 'price', 'year' и 'origin'.

Это дает вам гибкость:

  • Организуйте иерархически, скажем, 'year' и 'origin': df.set_index(['year', 'origin']),, скажем, 'origin' и 'price': df.set_index(['origin', 'price'])

  • Do groupby ей в соответствии с различными уровни

  • В целом, нарезайте и кубируйте данные вдоль многих ди по-разному.

То, что вы предлагаете в вопросе, делает одно измерение (происхождение) произвольно иным, и трудно думать об этом. Если раскол по некоторой размерности необходимо из-за того, чтобы, например, производительность, вы можете комбинировать DataFrames лучше со стандартными структурами данных Python:

  • отображение словаря каждый год к Dataframe с тремя другими размерами.

  • Три DataFrames, по одному для каждого происхождения, каждый из которых имеет три измерения.

Смежные вопросы