如何将每行含嵌套JSON的换行分隔JSON文件转为pandas DataFrame
如何将每行含嵌套JSON的换行分隔JSON文件转为pandas DataFrame
换行分隔的JSON(JSON Lines)文件每行都是独立JSON对象,且包含嵌套结构时,可通过以下两种常用方法转换为pandas DataFrame:
方法一:逐行解析+json_normalize展开嵌套
先逐行读取并解析每个JSON对象,再用pd.json_normalize按需展开嵌套层级,适合精准控制嵌套结构的展开方式。
示例代码:
import pandas as pd import json # 读取文件并收集所有解析后的JSON对象 parsed_data = [] with open('your_file.jsonl', 'r', encoding='utf-8') as f: for line in f: # 跳过空行(可选) if line.strip(): try: parsed_data.append(json.loads(line)) except json.JSONDecodeError as e: print(f"解析行失败: {e}") continue # 展开嵌套结构:以嵌套数组和嵌套对象为例 # record_path 指定要展开的嵌套数组字段,meta 指定保留的顶层/其他嵌套字段 df = pd.json_normalize( parsed_data, record_path=['posts'], # 展开posts数组 meta=[ 'id', ['user', 'name'], # 保留user下的name字段 ['user', 'age'] # 保留user下的age字段 ] ) print(df)
方法二:read_json读取后批量展开嵌套
先用pd.read_json的lines=True参数直接读取JSON Lines文件,得到包含嵌套列的原始DataFrame,再对嵌套列单独展开合并。
示例代码:
import pandas as pd # 直接读取JSON Lines文件,每行作为DataFrame的一行 raw_df = pd.read_json('your_file.jsonl', lines=True, encoding='utf-8') # 展开嵌套对象列(如user) nested_user_df = pd.json_normalize(raw_df['user']) # 合并展开后的列到原始DataFrame,删除原嵌套列 result_df = pd.concat([raw_df.drop('user', axis=1), nested_user_df], axis=1) # 若存在嵌套数组(如posts),可单独展开并关联原数据 posts_expanded = pd.json_normalize( raw_df.to_dict('records'), record_path='posts', meta='id' # 保留id用于关联 ) print(posts_expanded)
注意事项
- 若文件中存在格式错误的JSON行,建议添加
try-except捕获解析异常,避免程序中断; - 嵌套结构不统一时,
json_normalize会自动填充缺失值为NaN,无需额外处理; - 对于深度嵌套的结构,可多次调用
json_normalize逐层展开,或调整meta参数指定需要保留的字段路径。
内容的提问来源于stack exchange,提问作者Sc Maa
相关产品推荐
相关产品推荐

