Python Pandas:如何将JSON多值属性导出为多行CSV?代码调试求助
调试建议与修正方案
你的问题核心在于没有为每个relative条目创建独立的行,反而在循环中不断覆盖同一个temp字典的字段值,最终每个key只保留了最后一个条目,所以只生成了1行数据。我们需要调整逻辑,为每个relative条目生成单独记录,同时处理不同key下条目数量不一致的情况。
问题根源拆解
- 你的代码遍历
data1的key时,内层循环会把当前key的第j个relative.id赋值给temp[key],但每次循环都会覆盖之前的值,最终每个key仅保留最后一个条目。 - 没有考虑不同key下的条目数量差异(比如
XXXX只有1个,YYYYY有2个),需要为多出来的条目补全基础信息,并把无对应值的字段设为NaN。
修正后的代码
import pandas as pd json_file = { "data": [ { "Empid": "1234", "Empname": "ABC", "data1": { "XXXX": [{"relative": {"id": "Naveen"}}], "YYYYY": [{"relative": {"id": "Kumar"}}, {"relative": {"id": "Rajesh"}}] } } ] } df_list = [] # 遍历每个员工的基础数据 for emp in json_file['data']: emp_base = { 'Empid': emp['Empid'], 'Empname': emp['Empname'] } # 整理data1中每个key对应的所有relative id data1_id_dict = {} max_entry_count = 0 for key, entries in emp['data1'].items(): id_list = [item['relative']['id'] for item in entries] data1_id_dict[key] = id_list # 记录最多的条目数,用来生成对应行数 if len(id_list) > max_entry_count: max_entry_count = len(id_list) # 按最大条目数生成每行记录 for idx in range(max_entry_count): row = emp_base.copy() for key, ids in data1_id_dict.items(): # 当前索引有值则取,无则填充空值(对应CSV的NaN) row[key] = ids[idx] if idx < len(ids) else pd.NA df_list.append(row) # 生成DataFrame并导出CSV final_df = pd.DataFrame(df_list) print(final_df.to_csv(index=False))
代码逻辑说明
- 提取员工基础信息:先把每个员工的
Empid和Empname存为基础字典,避免重复生成。 - 整理各key的id列表:把
data1中每个key对应的所有relative.id收集成列表,同时记录最长的列表长度(这里是2,对应YYYYY的条目数)。 - 生成每行记录:循环最长长度的次数,每次复制基础信息,为每个key填充对应索引的id,索引超出列表长度时填充
pd.NA(对应CSV里的NaN)。 - 合并生成CSV:把所有行字典收集到列表中,转为DataFrame后导出为CSV。
输出结果
运行后会得到你期望的两行CSV:
Empid,Empname,XXXX,YYYYY 1234,ABC,Naveen,Kumar 1234,ABC,,Rajesh
(注:CSV中的空值显示为空,用Excel等工具打开会自动识别为NaN)
内容的提问来源于stack exchange,提问作者avinash
相关产品推荐
相关产品推荐

