Вложенный словарь с фреймами данных в фреймы данных в пандах - PullRequest
0 голосов
/ 15 января 2019

Я знаю, что есть несколько вопросов о вложенных словарях в dataframe, но их решения не работают для меня. У меня есть датафрейм, который содержится в словаре, который содержится в другом словаре, например:

df1 = pd.DataFrame({'2019-01-01':[38],'2019-01-02':[43]},index = [1,2])
df2 = pd.DataFrame({'2019-01-01':[108],'2019-01-02':[313]},index = [1,2])
da = {}
da['ES']={}
da['ES']['TV']=df1
da['ES']['WEB']=df2

Я хочу получить следующее:

df_final = pd.DataFrame({'market':['ES','ES','ES','ES'],'device':['TV','TV','WEB','WEB'],
                     'ds':['2019-01-01','2019-01-02','2019-01-01','2019-01-02'],
                     'yhat':[43,38,423,138]})

Получение кода из другого SO вопроса, который я пробовал:

market_ids = []
frames = []
for market_id,d in da.items():
  market_ids.append(market_id)
  frames.append(pd.DataFrame.from_dict(da,orient = 'index'))    
df = pd.concat(frames, keys=market_ids)

Что дает мне фрейм данных с несколькими индексами и устройствами в качестве имен столбцов.

Спасибо

1 Ответ

0 голосов
/ 15 января 2019

Код ниже работает хорошо и дает желаемый результат:

t1=da['ES']['TV'].melt(var_name='ds', value_name='yhat')
t1['market']='ES'
t1['device']='TV'

t2=da['ES']['WEB'].melt(var_name='ds', value_name='yhat')
t2['market']='ES'
t2['device']='WEB'

m = pd.concat([t1,t2]).reset_index().drop(columns={'index'})

print(m)

И вывод:

           ds  yhat market device
0  2019-01-01    38     ES     TV
1  2019-01-02    43     ES     TV
2  2019-01-01   108     ES    WEB
3  2019-01-02   313     ES    WEB

Основной вывод здесь - функция плавления, которую, если вы читаете о, не так сложно понять, что она здесь делает. Теперь, как я уже упоминал в комментарии выше, это можно сделать итеративно по всему словарю с именем da, но для этого мне потребуется реплицированная форма фактических данных. Я намеревался взять этот первый t1 в качестве начального кадра данных, а затем продолжать объединять его с другими, что должно быть действительно легко. Но я не знаю, каковы ваши реальные ценности. Но я уверен, что вы можете сами придумать, как это поставить под петлю.

Псевдокод для того цикла, о котором я говорю, будет выглядеть так:

real=t1
for a in da['ES'].keys():
    if a!='TV':

        p=da['ES'][a].melt(var_name='ds', value_name='yhat')
        p['market']='ES'
        p['device']=a

        real = pd.concat([real,p],axis=0,sort=True)

real.reset_index().drop(columns={'index'})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...