我知道关于数据字典的嵌套字典存在一些问题,但它们的解决方案对我不起作用。我有一个数据框,包含在一个字典中,该数据框包含在另一个字典中,如下所示:
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)
这给了我一个具有多个索引的数据框,并且设备作为列名。
谢谢
答案 0 :(得分:1)
下面的代码运行良好,并提供了所需的输出:
{
"presets": ["@babel/preset-env"],
"plugins": [
["@babel/transform-runtime"]
]
}
输出为:
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)
这里的主要要点是熔化函数,如果您读过它,那么理解它在做什么并不难。现在,正如我在上面的评论中提到的那样,可以在整个命名词典中迭代完成此操作,但是要执行此操作,我需要复制实际数据的形式。我打算做的是将第一个t1用作初始数据帧,然后继续对其隐瞒其他内容,这确实很容易。但我不知道您的实际价值如何。但是我敢肯定,您可以从上面自己弄清楚如何将其置于循环中。
我正在谈论的那个循环事情的伪代码是这样的:
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