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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 07:23:14