如何将Pandas DataFrame按层级结构转换为YAML格式?
问题描述
现有如下结构的Pandas DataFrame:
import pandas as pd df = pd.DataFrame({ 'title': ['dashboard1', 'dashboard1', 'dashboard2'], 'srv': ['ods', 'ods', 'ods'], 'db': ['db1', 'db1', 'db2'], 'sch': ['S1', 'S2', 'S4'], 'nm': ['Name1', 'Name2', 'Name3'] })
需要将其转换为层级结构的YAML,目标格式如下:
title: dashboard1 dataSources: dataObjects: - srv: ods db: db1 sch: S1 nm: Name1 - srv: ods db: db1 sch: S2 nm: Name2 title: dashboard2 dataSources: dataObjects: - srv: ods db: db2 sch: S4 nm: Name3
尝试过以下代码但未达到预期效果:
yaml.dump({'dataObjects': df.groupby('title')['nm'].apply(list).to_dict()}, allow_unicode=True)
解决方案
可以通过分组构造字典结构再使用PyYAML序列化的方式实现,步骤如下:
- 导入必要库:
import pandas as pd import yaml
- 按
title分组,为每个分组生成对应的层级字典:
# 分组并构造每个title的完整结构 result = [] for title, group in df.groupby('title'): # 把分组内的行转成字典列表,对应dataObjects的条目 data_objects = group.drop('title', axis=1).to_dict('records') # 组装当前title的层级结构 result.append({ 'title': title, 'dataSources': { 'dataObjects': data_objects } })
- 将构造好的字典序列化为符合要求的YAML:
# 生成标准多文档YAML(用---分隔每个title块,符合YAML规范) yaml_output = '\n---\n'.join( yaml.dump(item, allow_unicode=True, default_flow_style=False, sort_keys=False) for item in result ) print(yaml_output)
执行后输出结果:
title: dashboard1 dataSources: dataObjects: - srv: ods db: db1 sch: S1 nm: Name1 - srv: ods db: db1 sch: S2 nm: Name2 --- title: dashboard2 dataSources: dataObjects: - srv: ods db: db2 sch: S4 nm: Name3
关键说明
groupby('title')实现按仪表盘标题分组,每个分组对应目标YAML中的一个独立块group.drop('title', axis=1).to_dict('records')直接把分组内的每行数据转成字典,完美匹配dataObjects下的条目格式yaml.dump的参数default_flow_style=False确保列表以展开形式输出(而非紧凑的方括号格式),sort_keys=False保留原DataFrame的列顺序- 标准YAML不允许重复的顶级键,因此用
---分隔多个文档是规范写法;如果非要和示例完全一致(无---),可以直接序列化整个列表,但这种格式不符合YAML语法规范
内容的提问来源于stack exchange,提问作者Pavel Tashkinov
相关产品推荐
相关产品推荐

