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='')
关键修改说明
- 移除
explode操作:该操作会将数组元素拆分为多行,直接违背“一行对应原JSON一行”的需求。 - 自定义展开逻辑:通过
apply遍历每行,将pl数组的每个元素按序号生成新列,保证原行结构不变。 - 列顺序对齐:通过
reindex调整列的排列顺序,完全匹配期望的CSV格式。 - 空值处理:用
na_rep=''将缺失的字段(如a2的pl.age3、pl.n3)输出为空字符串,符合格式要求。
内容的提问来源于stack exchange,提问作者lex9527
相关产品推荐
相关产品推荐

