使用 python 将 Excel 中的按列 JSON 数据转换为层次结构

Posted

技术标签:

【中文标题】使用 python 将 Excel 中的按列 JSON 数据转换为层次结构【英文标题】:Translating column-wise JSON data from Excel into a hierarchical structure with python 【发布时间】:2021-04-04 03:53:08 【问题描述】:

总体目标

我的总体目标是将 Excel 文件中的输入转换为文本文件(Stata .do 文件),以执行一组数据协调任务,这些任务具有大致相同的结构,但由于数据的特殊性而需要单独处理数据(国家调查)。协调将由不同的人执行,Excel 确保人们使用相同的结构。我的策略是读取 JSON 结构的 Excel 文件,使用这个结构写入 do 文件。

我请求帮助的任务

我现在要解决的问题是如何将 JSON 从 Excel 中读取时的列结构转变为层次结构。我希望用户拥有的 Excel 文件具有块内的块和任务结构,以及执行任务所需的特定命令(一行或多行)。下图是 Excel 文档的示例:

最终目标是生成这样的文本文件:

* A 

* A1    
Command for A1
        
* A2    
Command for A2 (1)
Command for A2 (2)
        
* B 

* B1    
Command for B1 (1)
Command for B1 (2)
Command for B1 (3)
        
*B2 
Command for B2 (1)
Command for B2 (2)

我使用 Python 使用以下代码读取此内容:

path = "Some Path/test.xlsx"
import pandas
import json

x = pandas.read_excel(path, sheet_name='Sheet')
json_str = x.to_json()

如前所述,这会产生 JSON 的列结构,如下所示:

我正在努力将其转换为代码自然具有的层次结构。我想要的输出是这种形式的 JSON 对象:

如果有更聪明的方法来实现总体目标,我很高兴知道它,但我认为这种翻译是构建信息的必要步骤。

这里是生成 JSON 对象以便重现的代码

# Column-wise object
'"Block":"0":"* A","1":null,"2":null,"3":null,"4":null,"5":null,"6":"* B","7":null,"8":null,"9":null,"10":null,"11":null,"Task":"0":"* A1","1":null,"2":null,"3":"* A2","4":null,"5":null,"6":"* B1","7":null,"8":null,"9":null,"10":"*B2","11":null,"Code":"0":"Command for A1","1":null,"2":null,"3":"Command for A2 (1)","4":"Command for A2 (2)","5":null,"6":"Command for B1 (1)","7":"Command for B1 (2)","8":"Command for B1 (3)","9":null,"10":"Command for B2 (1)","11":"Command for B2 (2)"'

# Hierarchical object
'"* A": "* A1": ["Command for A1"], "* A2": ["Command for A2 (1)", "Command for A2 (2)"] , "* B" : "* B1" : ["Command for B1 (1)", "Command for B1 (2)", "Command for B1 (3)"], "* B2" : ["Command for B2 (1)", "Command for B2 (2)"]'

【问题讨论】:

【参考方案1】:

你可以这样做:

import pandas as pd
import json
from collections import defaultdict

path = "Some Path/test.xlsx"
df = pd.read_excel(path,
                   engine='openpyxl',
                   # header=None, names=['Block', 'Task', 'Code']  # only if your file has no headers
                   )

df.dropna(inplace=True, axis=0, how='all')
df.fillna(method='ffill', inplace=True, axis=0)
df = df.set_index(['Block', 'Task'])

nested_dict = defaultdict(lambda : defaultdict(list))

for keys, value in df.Code.iteritems():
    nested_dict[keys[0]][keys[1]].append(value)

json_str = json.dumps(nested_dict, indent=4, sort_keys=True)
print(json_str)

输出:


    "* A": 
        "* A1": [
            "Command for A1"
        ],
        "* A2": [
            "Command for A2 (1)",
            "Command for A2 (2)"
        ]
    ,
    "* B": 
        "* B1": [
            "Command for B1 (1)",
            "Command for B1 (2)",
            "Command for B1 (3)"
        ],
        "* B2": [
            "Command for B2 (1)",
            "Command for B2 (2)"
        ]
    

【讨论】:

以上是关于使用 python 将 Excel 中的按列 JSON 数据转换为层次结构的主要内容,如果未能解决你的问题,请参考以下文章

如何将多个csv按行合并?(不是首尾相接的按列合并)

PySpark 无法计算 Koalas DataFrame 中的按列标准差

两个数据帧的按列连接

Python脚本——excel文件按列导出

在 Python 中按列分组以获得总计数

DatagridView 按列折叠