You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将QuickBooks返回的嵌套利润表JSON转换为Pandas DataFrame?

QuickBooks损益报告JSON转DataFrame解决方案

实现思路

QuickBooks返回的损益报告JSON采用多层嵌套的章节结构,json_normalize无法直接适配动态嵌套层级,因此采用递归遍历的方式拆解所有Row节点,同时记录每一层的父级分类路径,最终汇总为结构化表格。

完整代码实现

import pandas as pd

# 递归解析嵌套Row节点
def parse_rows(rows_list, parent_categories=None):
    if parent_categories is None:
        parent_categories = []
    records = []
    
    for row in rows_list:
        current_level_name = None
        # 提取章节标题(Header字段)
        if "Header" in row:
            col_data = row["Header"]["ColData"]
            current_level_name = col_data[0]["value"]
        
        # 处理明细数据行
        if row.get("type") == "Data":
            col_data = row["ColData"]
            record = {
                "分类路径": " > ".join(parent_categories),
                "科目名称": col_data[0]["value"],
                "科目ID": col_data[0].get("id"),
                "金额": float(col_data[1]["value"]) if col_data[1]["value"] else None,
                "是否汇总行": False
            }
            records.append(record)
        
        # 处理嵌套章节(Section类型)
        if row.get("type") == "Section":
            # 先提取章节汇总行
            if "Summary" in row:
                sum_col_data = row["Summary"]["ColData"]
                record = {
                    "分类路径": " > ".join(parent_categories),
                    "科目名称": sum_col_data[0]["value"],
                    "科目ID": None,
                    "金额": float(sum_col_data[1]["value"]) if sum_col_data[1]["value"] else None,
                    "是否汇总行": True
                }
                records.append(record)
            
            # 递归解析子节点,更新父级分类路径
            if "Rows" in row and "Row" in row["Rows"]:
                new_parent = parent_categories.copy()
                if current_level_name:
                    new_parent.append(current_level_name)
                child_records = parse_rows(row["Rows"]["Row"], new_parent)
                records.extend(child_records)
    
    return records

# 调用示例(qb_pl_json为API返回的JSON数据变量)
all_records = parse_rows(qb_pl_json["Rows"]["Row"])
df = pd.DataFrame(all_records)

输出字段说明

  • 分类路径:科目所属的多级分类,示例值:收入 > 园林绿化服务 > 工程材料
  • 科目名称:具体的收入/支出科目或汇总项名称
  • 科目ID:QuickBooks内科目唯一标识,汇总行无值
  • 金额:对应科目的数值,已转换为浮点型
  • 是否汇总行:标识当前行是否为分类合计项

可选调整

如果仅需要明细科目数据,过滤汇总行即可:

detail_df = df[df["是否汇总行"] == False].reset_index(drop=True)

内容的提问来源于stack exchange,提问作者Tabish Akhtar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 15:39:02