python - 带有数据框的嵌套字典到熊猫中的数据框
问题描述
我知道有一些关于嵌套字典到数据框的问题,但他们的解决方案对我不起作用。我有一个数据框,它包含在一个字典中,该字典包含在另一个字典中,如下所示:
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)
这给了我一个具有多个索引和设备作为列名的数据框。
谢谢
解决方案
下面的代码运行良好,并提供了所需的输出:
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
这里的主要内容是 melt 功能,如果您阅读过它,并不难理解它在这里做了什么。现在正如我在上面的评论中提到的,这可以在整个 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'})
推荐阅读
- flutter - 我使用 ADB 运行颤振应用程序,但该应用程序未显示在菜单中
- amazon-web-services - 无法测试基于 AWS Cognito 的用户注册和登录
- sql-server - SQL Server 到服务总线
- listview - SwiftUI:删除列表视图左右的空间?
- powershell - 在两个非常大的列表中查找不同之处
- node.js - 如何使用 API 路由在 Next.js 上下载文件
- c# - UWP - “System.IO.IOException:'网络访问被拒绝:'......”
- html - Shopify 上产品块的交替背景颜色?
- youtube - 具有自定义 URL 但 URL 中没有“c/” slug 的 YouTube 频道不会从 channels.list 端点返回 snippet.customUrl 道具
- javascript - 如何使用 VueJS 将 Outlook 消息拖放到浏览器中