使用Python DataFrame规范化嵌套JSON的问题
使用Python DataFrame规范化嵌套JSON的问题
嘿,我之前处理嵌套JSON转DataFrame的时候也踩过类似的坑,不过用Pandas的话其实有几种实用方法能搞定你这个场景!先看你的JSON结构,每个主条目里的NestedAttribute1/2/3都是只包含单个字典的数组,目标应该是把这些嵌套的id和value展开成扁平的列对吧?
我给你两种常用的解决方案:
方法一:用apply手动提取字段
这种方法比较直观,适合刚接触Pandas的朋友,就是逐个处理每个嵌套列,把数组里的字典字段提取出来:
import pandas as pd import json # 先加载你的JSON数据(假设存在本地文件中) with open('your_data.json', 'r', encoding='utf-8') as f: json_data = json.load(f) # 把aaData转换成初始DataFrame df = pd.DataFrame(json_data['aaData']) # 提取每个嵌套属性的id和value df['NestedAttribute1_id'] = df['NestedAttribute1'].apply(lambda x: x[0]['id']) df['NestedAttribute1_value'] = df['NestedAttribute1'].apply(lambda x: x[0]['value']) df['NestedAttribute2_id'] = df['NestedAttribute2'].apply(lambda x: x[0]['id']) df['NestedAttribute2_value'] = df['NestedAttribute2'].apply(lambda x: x[0]['value']) df['NestedAttribute3_id'] = df['NestedAttribute3'].apply(lambda x: x[0]['id']) df['NestedAttribute3_value'] = df['NestedAttribute3'].apply(lambda x: x[0]['value']) # 删除原来的嵌套列,得到扁平的DataFrame df = df.drop(['NestedAttribute1', 'NestedAttribute2', 'NestedAttribute3'], axis=1)
方法二:用pd.json_normalize(更专业的方式)
Pandas专门提供了json_normalize工具来处理嵌套JSON,代码更简洁,扩展性也更好:
import pandas as pd import json with open('your_data.json', 'r', encoding='utf-8') as f: json_data = json.load(f) # 先提取主数据里的Name列作为基础 df_main = pd.DataFrame(json_data['aaData'])[['Name']] # 遍历每个嵌套属性,展开后合并到主DataFrame for attr_name in ['NestedAttribute1', 'NestedAttribute2', 'NestedAttribute3']: # 展开当前嵌套属性,用record_prefix给字段加前缀避免重名 df_nested = pd.json_normalize( json_data['aaData'], record_path=attr_name, meta=['Name'], record_prefix=f'{attr_name}_' ) # 和主数据合并 df_main = df_main.merge(df_nested, on='Name', how='left') # 最终的df_main就是规范化后的扁平表
小提醒
如果你的嵌套数组以后可能出现多个元素的情况,上面的方法就需要调整——得把每个数组元素展开成单独的行,这时候只需要在json_normalize里指定record_path为对应嵌套列、meta保留其他主字段就行,不过看你现在的例子每个数组只有一个元素,上面的方法完全够用~
备注:内容来源于stack exchange,提问作者reddwarfcrew
相关产品推荐
相关产品推荐

