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

JSON转CSV格式异常求助:如何通过Pandas生成规范表格

解决嵌套JSON转CSV的列规范问题

嘿,我来帮你搞定这个嵌套JSON转CSV的列规范问题——从你给出的示例和描述来看,核心问题是你的JSON有层级嵌套(外层data是键值对结构,还有items数组、extras空对象),直接用Pandas默认方法转CSV肯定会出现列错位、标签混乱的情况。我给你一套清晰的解决方案:

第一步:先理清楚你的JSON结构

首先补全你给出的示例JSON(看起来少了闭合括号,我加了一条测试数据方便演示):

{
  "data": {
    "1": {
      "id": 1,
      "items": [ "bar", "cream" ],
      "extras": {},
      "supply": "crate"
    },
    "2": {
      "id": 2,
      "items": [ "cake", "jam" ],
      "extras": {"note": "no ice"},
      "supply": "box"
    }
  }
}

第二步:用Pandas分步处理,保证列规范

下面是完整的处理代码,每一步都标注了作用:

import pandas as pd
import json

# 1. 加载JSON数据(如果是文件就读取,直接用字符串的话可以跳过open步骤)
with open('your_data.json', 'r', encoding='utf-8') as f:
    raw_data = json.load(f)

# 2. 展开外层的`data`结构:把每个编号对应的对象转成DataFrame的一行
# 用orient='index'是因为`data`里的键("1"、"2")是行的标识,避免把它们当成列
df = pd.DataFrame.from_dict(raw_data['data'], orient='index').reset_index(drop=True)

# 3. 处理`items`数组(两种可选方案,按需选择)
# 方案A:把数组拆成多行,每个元素对应一行,其他列数据重复(适合需要单独统计每个item的场景)
df_clean = df.explode('items')

# 方案B:把数组用非逗号分隔符合并成字符串(适合要保留一行对应一个id的场景)
# df_clean = df.copy()
# df_clean['items'] = df_clean['items'].apply(lambda x: '; '.join(x))

# 4. 处理`extras`列:空对象转成空字符串,有内容的转成可读格式
# 如果`extras`里的键固定(比如都有note),可以直接提取成单独列;如果不固定,转成字符串最稳妥
df_clean['extras'] = df_clean['extras'].apply(lambda x: json.dumps(x) if x else '')

# 5. 保存成规范的CSV
df_clean.to_csv('formatted_data.csv', index=False, encoding='utf-8')

为什么之前的转换会出问题?

你之前的代码可能直接用了pd.read_json(),但这个方法默认不会处理层级嵌套的结构:

  • 外层的data会被当成一个单独的列,里面全是嵌套的JSON字符串
  • items数组会直接以["bar","cream"]的形式写入CSV,和CSV的逗号分隔符冲突,导致列错位
  • 空的extras对象会显示成{},破坏表格的可读性

额外提示

如果你的data里有大量行,或者extras有固定的键,可以进一步优化:

  • 对于固定键的extras,用pd.json_normalize()直接展开成单独列,比如:
    df = pd.json_normalize(raw_data['data'].values())
    
    这个方法会自动把嵌套对象的键转成列,比如extras.note会变成一个单独的列。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 04:02:08