使用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
相关产品推荐
相关产品推荐

