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

Python JSON转CSV行数异常及自定义宽表格式实现需求

问题

尝试用Python将JSON转换为CSV时遇到问题:2行JSON数据生成了5行CSV输出。需求是将嵌套数组pl的元素展开为对应列,每行对应原JSON的一行。

原始JSON示例

{ "_id" : "a1" ,"pl" : [ { "age" : 45, "n" : "ar"}, { "age" : 52, "n" : "Pi" }, { "age" : 18, "n" : "al"} ] , "ld" : 13}
{ "_id" : "a2" ,"pl" : [ { "age" : 85, "n" : "ta"}, { "age" : 46, "n" : "lee" }] , "ld" : 14}

当前错误CSV输出

_id,  ld,  age,  n,  age,  n
a1,  13,  45,  ar,  45,  ar
a1,  13,  52,  Pi,  52,  Pi
a1,  13,  18,  al,  18,  al
a2,  14,  85,  ta,  85,  ta
a2,  14,  46,  lee,  46,  lee

使用的Python代码

import pandas as pd
import glob

for i in glob.glob('D:\\1.json'):
    data = []
    df_it = pd.read_json(i, encoding='utf-8', lines=True, chunksize=100, dtype=object)
    for sub in df_it:
     data.append(sub)
    df = pd.concat(data)
    df = df.explode('pl')
    df = pd.concat([
        df.reset_index(drop=True),
        pd.json_normalize(df.pl),
    ], axis=1)
    df = df.drop(['pl', ], axis=1)
    df.to_csv('D:\\1.csv', index=None, encoding='utf-8')

期望CSV格式

_id, pl.age1,  pl.n1,  pl.age2,  pl.n2, pl.age3,  pl.n3, ld
a1,    45,      ar,       52,     Pi,     18,      al,    13
a2,    85,      ta,       46,     lee,      ,        ,    14
解决方案

原代码用explode把数组拆成多行,这是导致输出行数异常的核心原因。要实现每行对应原JSON一行,需要把pl数组的每个元素展开为带序号的列,而非拆分行。

修改后的代码如下:

import pandas as pd
import glob

for file_path in glob.glob('D:\\1.json'):
    # 按行读取JSON数据
    df = pd.read_json(file_path, encoding='utf-8', lines=True, dtype=object)
    
    # 自定义函数:将pl数组展开为带序号的列
    def expand_pl(row):
        pl_data = row['pl']
        expanded_cols = {}
        # 遍历数组元素,生成pl.ageX、pl.nX格式的列名
        for idx, item in enumerate(pl_data, start=1):
            expanded_cols[f'pl.age{idx}'] = item['age']
            expanded_cols[f'pl.n{idx}'] = item['n']
        return pd.Series(expanded_cols)
    
    # 应用展开函数,合并到原DataFrame
    pl_expanded = df.apply(expand_pl, axis=1)
    df_result = pd.concat([df.drop('pl', axis=1), pl_expanded], axis=1)
    
    # 调整列顺序,匹配期望格式
    desired_columns = ['_id', 'pl.age1', 'pl.n1', 'pl.age2', 'pl.n2', 'pl.age3', 'pl.n3', 'ld']
    df_result = df_result.reindex(columns=desired_columns)
    
    # 保存CSV,空值替换为空字符串
    df_result.to_csv('D:\\1.csv', index=None, encoding='utf-8', na_rep='')

关键修改说明

  1. 移除explode操作:该操作会将数组元素拆分为多行,直接违背“一行对应原JSON一行”的需求。
  2. 自定义展开逻辑:通过apply遍历每行,将pl数组的每个元素按序号生成新列,保证原行结构不变。
  3. 列顺序对齐:通过reindex调整列的排列顺序,完全匹配期望的CSV格式。
  4. 空值处理:用na_rep=''将缺失的字段(如a2的pl.age3、pl.n3)输出为空字符串,符合格式要求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 03:50:05