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

使用json_normalize解析JSON后能否保留Pandas DataFrame列顺序?

保留JSON解析后DataFrame的列顺序当然可以!

你遇到的问题是因为pd.json_normalize()默认会把输出的列按字母顺序排序,哪怕原始JSON里的键是有固定顺序的。不过有两种简单的方法能让列顺序和原始JSON保持一致:

方法1:提前指定目标列顺序(推荐)

先从第一个companie对象里提取键的顺序,然后每次调用json_normalize时用columns参数指定这个顺序。这样不管后续解析多少条数据,列的顺序都会严格和原始JSON一致,还能自动处理部分对象缺少字段的情况(缺失的字段会填充为NaN)。

修改后的代码如下:

import pandas as pd

df = None
target_columns = None  # 用来存储我们想要的列顺序

for row in json_data["results"]["companies"]:
    companie_data = row["companie"]
    # 第一次循环时,获取原始JSON的键顺序
    if target_columns is None:
        target_columns = list(companie_data.keys())
    # 用columns参数强制指定列顺序
    temp_df = pd.json_normalize(companie_data, columns=target_columns)
    
    if df is None:
        df = temp_df
    else:
        df = pd.concat([df, temp_df], ignore_index=True)

# 最后确保列完全按目标顺序排列(可选,但更稳妥)
df = df[target_columns]

方法2:事后重新排列列

如果不想修改循环里的json_normalize调用,也可以在第一次解析后记录下正确的列顺序,等所有数据拼接完成后,重新调整列的顺序:

import pandas as pd

df = None
column_order = None

for row in json_data["results"]["companies"]:
    temp_df = pd.json_normalize(row["companie"])
    if df is None:
        df = temp_df
        # 记录第一次解析后的列顺序(此时如果你的Python版本≥3.7,Pandas会保留JSON的键顺序)
        column_order = df.columns.tolist()
    else:
        df = pd.concat([df, temp_df], ignore_index=True)

# 按记录的顺序重新排列列
df = df[column_order]

注意事项

  • 如果你使用的是Python 3.6及以下版本,普通字典不会保留插入顺序,这时候方法1更可靠,因为它直接从原始JSON对象提取键的顺序(假设你的JSON解析库是保留顺序的,比如json.loads用object_pairs_hook=OrderedDict)。
  • 如果不同的companie对象有不同的字段,方法1会把所有出现过的字段按第一个对象的顺序保留,缺失的字段填充NaN;方法2则会包含所有字段,但只按第一个对象的顺序排列,后续新增的字段会排在最后(不过这种情况建议还是用方法1来控制顺序)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 08:27:34