如何让Pandas保留JSON原字段顺序导出Excel?
保留JSON原始字段顺序导出Excel的解决方案
我完全懂你遇到的这个闹心问题——用Pandas把JSON转Excel时,原本好好的字段顺序会被自动打乱,导出的Excel列顺序和原JSON完全对不上。下面针对你提到的两种JSON格式(单个对象、对象数组),分别给出靠谱的解决办法,核心思路就是先锁定原始JSON的字段顺序,再强制Pandas按这个顺序生成DataFrame和Excel。
情况1:单个JSON对象(非数组)
你的原始代码里,pd.read_json()默认会对列进行排序。我们换个思路,先把JSON字符串解析成Python字典(Python3.7+的字典天生是插入有序的),拿到原始字段顺序后再创建DataFrame:
import pandas as pd import json # 你的原始JSON字符串 json_text = '{"b": 22, "x": 12, "a": 2, "c": 4}' # 解析为有序字典(Python3.7+默认保留插入顺序) data_dict = json.loads(json_text) # 提取原始字段顺序 original_columns = list(data_dict.keys()) # 强制按原始顺序创建DataFrame df = pd.DataFrame([data_dict], columns=original_columns) # 导出Excel(和你原来的导出逻辑一致) file_name = 'test.xls' file_path = "/tmp/" + file_name df.to_excel(file_path, index=False) print("path to excel " + file_path)
这样导出的Excel就会严格保留b, x, a, c的原始顺序,不会被Pandas自动排序。
情况2:JSON对象数组
对于数组形式的JSON,我们只需要从第一个对象里提取原始字段顺序(假设数组里所有对象的字段顺序一致),再用同样的方式强制指定列顺序即可:
import pandas as pd import json # 你的原始JSON数组字符串 json_text = '[{"b": 22, "x":12, "a": 2, "c": 4}, {"b": 22, "x":12, "a": 2, "c": 2}, {"b": 22, "x":12, "a": 4, "c": 4}]' # 解析为有序对象列表 data_list = json.loads(json_text) # 从第一个对象获取原始字段顺序 original_columns = list(data_list[0].keys()) # 按原始顺序创建DataFrame df = pd.DataFrame(data_list, columns=original_columns) # 导出Excel file_name = 'test_array.xls' file_path = "/tmp/" + file_name df.to_excel(file_path, index=False) print("path to excel " + file_path)
额外说明(兼容旧Python版本)
如果你的Python版本是3.6及以下(这些版本的普通字典是无序的),可以用collections.OrderedDict来确保解析后的字段顺序不变,只需要修改解析那一行:
from collections import OrderedDict data_dict = json.loads(json_text, object_pairs_hook=OrderedDict) # 数组的情况同理:data_list = json.loads(json_text, object_pairs_hook=OrderedDict)
内容的提问来源于stack exchange,提问作者nesalexy
相关产品推荐
相关产品推荐

