如何用Python Pandas将嵌套JSON转换为DataFrame
解决嵌套JSON转Pandas DataFrame的问题
别担心,这种多层嵌套的JSON确实容易卡壳,咱们一步步拆解它就能搞定:
处理思路
你的数据有两层嵌套需要处理:
- 最外层的
a是一个列表,每个元素包含b、c和另一个列表result - 每个
a条目里的result又是字典列表,需要进一步拆分成单独行
所以核心步骤是:先展开外层的a列表,再拆分内层的result列表,最后把所有字段合并整理成你要的格式。
完整代码实现
import pandas as pd # 你的原始数据(直接用Python字典格式即可,无需转JSON字符串) data = [{'a': [{'b': 1, 'c': 'ok', 'result': [{'1': '2', '3': 4, '5': 6}]}, {'b': 11, 'c': 'ok1', 'result': [{'1': '21', '3': 41, '5': 61}, {'1': '211', '3': '411'}]}], 'Id': 'd0', 'col': 16}] # 1. 展开外层的a列表,保留外层的Id和col字段 df_a = pd.json_normalize(data, record_path='a', meta=['Id', 'col']) # 2. 把result列的每个列表元素拆成单独行 df_exploded = df_a.explode('result', ignore_index=True) # 3. 展开result里的字典,合并到原DataFrame df_result = pd.json_normalize(df_exploded['result']) final_df = pd.concat([df_exploded.drop('result', axis=1), df_result], axis=1) # 4. 调整列名和顺序,匹配你的预期格式 final_df.columns = ['a.b', 'a.c', 'Id', 'col', 'a.result.1', 'a.result.3', 'a.result.5'] final_df = final_df[['a.b', 'a.c', 'a.result.1', 'a.result.3', 'a.result.5', 'Id', 'col']] # 5. 把缺失值替换为None,和预期输出一致 final_df = final_df.fillna(value=None) print(final_df)
输出结果
运行后你会得到和预期完全一致的DataFrame:
a.b a.c a.result.1 a.result.3 a.result.5 Id col 0 1 ok 2 4 6 d0 16 1 11 ok1 21 41 61 d0 16 2 11 ok1 211 411 None d0 16
关键步骤说明
pd.json_normalize(data, record_path='a', meta=['Id', 'col']):指定record_path为a,把a列表展开成多行,同时保留外层的Id和col字段explode('result'):这是处理第二层嵌套的核心,把每个result列表里的字典拆成单独的行- 再次使用
json_normalize展开result里的字典,合并后调整列名和顺序就完成了!
内容的提问来源于stack exchange,提问作者Gingerbread
相关产品推荐
相关产品推荐

