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

使用Python pandas将嵌套JSON转换为指定分层格式CSV

需求说明

目标是将给定的嵌套JSON财务数据按照指定规则转换为CSV数据框,为整体项目的组成环节。

待处理数据(response.json)

[
    {
      "fiscalPeriodYearMonth": "2012-09",
      "revenuePer": {
        "yearOverYear": 19.57,
        "threeYearAvg": 28.24,
        "fiveYearAvg": 21.240000000000002,
        "tenYearAvg": 28.96
      },
      "operatingIncome": {
        "yearOverYear": 21.57,
        "threeYearAvg": 50.019999999999996,
        "fiveYearAvg": 30.3,
        "tenYearAvg": null
      },
      "netIncomePer": {
        "yearOverYear": 14.000000000000002,
        "threeYearAvg": 44.330000000000005,
        "fiveYearAvg": 29.01,
        "tenYearAvg": null
      },
      "epsPer": {
        "yearOverYear": 16.55,
        "threeYearAvg": 44.65,
        "fiveYearAvg": 30.830000000000002,
        "tenYearAvg": null
      }
    },
    {
      "fiscalPeriodYearMonth": "2013-09",
      "revenuePer": {
        "yearOverYear": 7.5600000000000005,
        "threeYearAvg": 18.87,
        "fiveYearAvg": 17.9,
        "tenYearAvg": 29.020000000000003
      },
      "operatingIncome": {
        "yearOverYear": 1.06,
        "threeYearAvg": 23.27,
        "fiveYearAvg": 34.11,
        "tenYearAvg": 58.93000000000001
      },
      "netIncomePer": {
        "yearOverYear": 0.77,
        "threeYearAvg": 22.42,
        "fiveYearAvg": 30.12,
        "tenYearAvg": 52.459999999999994
      },
      "epsPer": {
        "yearOverYear": 1.4500000000000002,
        "threeYearAvg": 23.46,
        "fiveYearAvg": 31.5,
        "tenYearAvg": 47.88
      }
    }
]

现有问题代码

import pandas as pd
df = pd.read_json(r'PATH TO JSON FILE', orient ='values')
print(df.T.to_csv("final_output.csv"))

上述代码未对嵌套JSON结构做扁平化、行结构重构、格式映射处理,运行后无法得到符合要求的输出。

期望输出规则

输出CSV以财期年月(如2012-09、2013-09)为列名,行按财务指标分层排列,具体规则:

  • 首行为指标大类名称行:revenuePer对应显示为Revenue,operatingIncome、netIncomePer、epsPer直接使用原字段名,大类行对应列值留空
  • 每个大类下依次排列4个指标行:Year Over Year、3-Year Average、5-Year Average、10-Year Average,填入对应财期数值,保留两位小数,空值显示为-
  • 不同大类之间保留空行分隔
解决方案

直接读取嵌套JSON后按规则手动构建行结构即可,可直接运行的代码如下:

import pandas as pd
import json

# 替换为你的response.json实际存储路径
with open("response.json", "r", encoding="utf-8") as f:
    raw_data = json.load(f)

# 配置映射规则
category_mapping = {
    "revenuePer": "Revenue",
    "operatingIncome": "operatingIncome",
    "netIncomePer": "netIncomePer",
    "epsPer": "epsPer"
}
sub_metric_order = [
    ("yearOverYear", "Year Over Year"),
    ("threeYearAvg", "3-Year Average"),
    ("fiveYearAvg", "5-Year Average"),
    ("tenYearAvg", "10-Year Average")
]

# 提取所有财期作为列
period_cols = [entry["fiscalPeriodYearMonth"] for entry in raw_data]
output_rows = []

for cat_key, cat_display in category_mapping.items():
    # 写入大类标题行
    output_rows.append([cat_display] + [""] * len(period_cols))
    # 写入该大类下所有子指标行
    for sub_key, sub_display in sub_metric_order:
        current_row = [sub_display]
        for entry in raw_data:
            val = entry[cat_key][sub_key]
            current_row.append("-" if val is None else f"{round(val, 2):.2f}")
        output_rows.append(current_row)
    # 大类之间加空行
    output_rows.append([""] * (len(period_cols) + 1))

# 移除末尾多余空行
output_rows = output_rows[:-1]
# 生成数据框并导出CSV
final_df = pd.DataFrame(output_rows, columns=["Metric"] + period_cols)
final_df.to_csv("final_output.csv", index=False, encoding="utf-8-sig")

运行代码后导出的final_output.csv完全匹配规则要求:数值自动保留两位小数、空值统一显示为-、大类间有空行分隔,列名对应各财期年月。


内容的提问来源于stack exchange,提问作者Shah hussain

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 20:06:26