json.load读取JSON文件报错,pandas.read_json加载后address嵌套字段如何拆分列?
嵌套JSON字段拆分解决方法
你最开始遇到的JSONDecodeError报错原因:你的源文件为行分隔JSON格式(JSON Lines),每个JSON对象独立占一行,整个文件不属于单个合法JSON结构,因此直接调用json.load()读取会识别到首行JSON结束后仍有额外数据,抛出错误。使用pd.read_json()加lines=True参数是适配该格式的正确写法。
针对嵌套address列的拆分需求,可选用以下两种实现方案:
方案1:基于已读取的DataFrame直接拆分
适合已经将数据加载到DataFrame的场景,仅需对address列做转换后合并即可:
# 将address列的每一个字典元素转换为Series,自动生成对应字段列 address_expand = df['address'].apply(pd.Series) # 合并展开后的地址列到原DataFrame,同时删除原address列 df = pd.concat([df.drop(columns=['address']), address_expand], axis=1)
执行后原address列的region、street-address、postal-code、locality四个字段会直接作为独立列加入DataFrame。
方案2:读取阶段直接展开嵌套结构
数据量较大时推荐该方案,使用pd.json_normalize()一次性完成嵌套字段解析,性能更优:
import json import pandas as pd # 逐行加载所有JSON对象到列表 with open('offering.txt', 'r', encoding='utf-8') as f: json_list = [json.loads(line.strip()) for line in f if line.strip()] # 解析嵌套结构直接生成扁平化DataFrame df = pd.json_normalize(json_list)
该方法默认生成的地址列会带address.前缀(如address.region、address.street-address),如果不需要前缀可添加sep=''参数,或后续自行重命名列名即可。
内容的提问来源于stack exchange,提问作者Arooj Fatima
相关产品推荐
相关产品推荐

