Python解析JSON时保留指定列及处理多值属性问题
解决Pandas解析多结构JSON的列过滤与嵌套属性问题
嘿,我看你现在卡在两个关键点上:指定列过滤没生效,还有JSON里两种不同嵌套结构的属性处理,咱们一步步来解决:
先搞定列过滤失效的问题
你当前的代码只是初始化了一个空DataFrame并指定了列,但根本没从JSON数据里筛选对应列!而且readlines()会把每行末尾的换行符也读进来,导致列名和实际提取的键不匹配,这也是过滤失效的隐形原因。先把列列表的读取修正了:
import json import pandas as pd # 读取指定列名,同时清理掉换行符和空行 with open('Columns.txt') as c: columns_list = [col.strip() for col in c.readlines() if col.strip()]
处理两种嵌套属性结构
你的JSON有两种完全不同的属性嵌套逻辑,必须先把这些嵌套结构扁平化成键值对,才能正常用Pandas处理。我写了个提取函数,能自动识别两种结构:
def extract_attributes(item): attrs = {} # 取出当前条目的attributes字段,默认空字典避免报错 attributes = item.get('attributes', {}) for attr_key, attr_value in attributes.items(): # 第一种场景:[attributes][ABC][Values][Value] if 'Values' in attr_value and isinstance(attr_value['Values'], list): # 这里默认取第一个Value,要是有多条可以改成拼接或者其他逻辑 attrs[attr_key] = attr_value['Values'][0].get('Value', None) # 第二种场景:[attributes][Xdfghgjgjgj][grp](含2条记录) elif 'grp' in attr_value and isinstance(attr_value['grp'], list): # 这里给两种处理方案,你按需选: # 方案1:把两条记录拼接成逗号分隔的字符串 attrs[attr_key] = ', '.join(str(grp_entry) for grp_entry in attr_value['grp']) # 方案2:保留列表格式,后续可以用explode拆成多行 # attrs[attr_key] = attr_value['grp'] return attrs
完整流程串起来:解析→扁平化→筛选列
现在把整个流程整合,确保最终DataFrame只保留你要的400列:
# 读取JSON文件 with open('JsonFile.json') as f: json_file = json.load(f) # 遍历每条JSON数据,提取扁平化的属性 processed_records = [] for record in json_file: flat_attrs = extract_attributes(record) processed_records.append(flat_attrs) # 转成DataFrame后直接按指定列筛选,不存在的列会显示NaN df = pd.DataFrame(processed_records)[columns_list] # 看看结果是否符合预期 print(df.head())
额外提示
- 列名匹配要严格:一定要保证
Columns.txt里的列名和JSON中提取的键完全一致(大小写、拼写都不能错),不然对应列会显示NaN。 - 大数据量优化:如果JSON文件特别大,别用列表存处理后的记录,改用生成器能省内存:
processed_records = (extract_attributes(record) for record in json_file) df = pd.DataFrame(processed_records)[columns_list] - 多记录拆分行:要是第二种场景的
grp需要拆成单独的行,生成DataFrame后用df = df.explode('Xdfghgjgjgj')就能实现。
内容的提问来源于stack exchange,提问作者avinash
相关产品推荐
相关产品推荐

