Pandas如何读取JSON文件:从入门到实践
在数据处理与分析领域,JSON(JavaScript Object Notation)作为一种轻量级、易读的数据交换格式,被广泛应用于Web开发、API接口和数据存储场景,而Python的Pandas库作为数据分析的利器,提供了强大的JSON数据读取功能,能够将JSON文件灵活转换为DataFrame结构,便于后续的清洗、转换和分析,本文将详细介绍Pandas读取JSON文件的多种方法、参数配置及实际应用场景,帮助您快速这一技能。
Pandas读取JSON文件的核心方法:read_json()
Pandas提供了read_json()
函数,专门用于将JSON格式的数据读取为DataFrame对象,该函数支持多种JSON数据结构,能够处理从简单到复杂的各类JSON文件,是连接JSON数据与Pandas数据分析流程的核心桥梁。
基本语法与参数概览
read_json()
函数的基本语法如下:
pandas.read_json( path_or_buf, # JSON文件路径、URL或文件类对象 orient=None, # 指定JSON数据的格式 typ='frame', # 返回数据类型,'frame'(DataFrame)或'series'(Series) dtype=True, # 是否自动推断数据类型 convert_dates=True, # 是否转换日期列 keep_default_dates=True, # 是否保留默认日期格式 numpy=False, # 是否返回NumPy数组 precise_float=False, # 是否精确解析浮点数 date_unit=None, # 日期时间单位(如's'、'ms'、'us'、'ns') encoding=None, # 文件编码格式 lines=False, # 是否按行读取JSON(每行一个JSON对象) chunksize=None, # 分块读取,返回迭代器 compression='infer', # 文件压缩格式('infer'、'gzip'、'bz2'、'zip'等) nrows=None, # 读取指定行数(仅适用于lines=True) storage_options=None, # 针对URL或远程存储的额外选项(如认证信息) errors='strict', # 解析错误时的处理方式('strict'、'ignore'、'raise') **kwargs # 其他可选参数 )
最简单的用法:读取标准JSON文件
假设有一个名为data.json
的标准JSON文件,内容如下(字典形式,键为列名,值为列表):
{ "name": ["Alice", "Bob", "Charlie"], "age": [25, 30, 35], "city": ["New York", "London", "Paris"] }
使用read_json()
直接读取即可:
import pandas as pd df = pd.read_json('data.json') print(df)
输出结果:
name age city
0 Alice 25 New York
1 Bob 30 London
2 Charlie 35 Paris
这是最常见的情况:JSON数据是一个字典,键对应DataFrame的列名,值对应列的数据列表,此时read_json()
会自动识别结构并转换为DataFrame。
处理不同结构的JSON数据:orient
参数的妙用
JSON数据的结构多样,orient
参数是read_json()
的关键,它告诉Pandas如何解析JSON的层级关系,常见的orient
取值包括:'columns'
、'index'
、'records'
、'values'
、'split'
,以及针对嵌套JSON的'table'
。
'columns'
:默认格式(键为列名)
如上述示例,JSON数据是字典结构,键为列名,值为列表。orient='columns'
(默认)会直接将键作为列名,列表作为列数据。
示例:
{"name": ["Alice", "Bob"], "age": [25, 30]}
df = pd.read_json('data.json', orient='columns')
'index'
:键为行索引,内层字典为列值
当JSON的键是行索引,内层字典的键是列名时,需指定orient='index'
。
示例JSON(index.json
):
{ "row1": {"name": "Alice", "age": 25}, "row2": {"name": "Bob", "age": 30} }
读取代码:
df = pd.read_json('index.json', orient='index') print(df)
输出:
name age
row1 Alice 25
row2 Bob 30
'records'
:列表形式,每个元素为字典(行记录)
这是API接口返回的常见格式:JSON是一个列表,每个元素是一个字典,字典的键是列名,值是对应行的数据。
示例JSON(records.json
):
[ {"name": "Alice", "age": 25, "city": "New York"}, {"name": "Bob", "age": 30, "city": "London"} ]
读取代码:
df = pd.read_json('records.json', orient='records') print(df)
输出:
name age city
0 Alice 25 New York
1 Bob 30 London
'values'
:仅保留数据,忽略行列名
JSON数据仅包含纯值列表(二维数组形式),orient='values'
会直接将其转换为DataFrame,不添加行列索引名称。
示例JSON(values.json
):
[ ["Alice", 25, "New York"], ["Bob", 30, "London"] ]
读取代码:
df = pd.read_json('values.json', orient='values') print(df)
输出(列名为默认整数索引):
0 1 2
0 Alice 25 New York
1 Bob 30 London
'split'
:字典形式,包含"index"、"columns"、"data"键
JSON数据被拆分为索引、列名和数据三部分,需明确指定orient='split'
。
示例JSON(split.json
):
{ "index": ["row1", "row2"], "columns": ["name", "age"], "data": [["Alice", 25], ["Bob", 30]] }
读取代码:
df = pd.read_json('split.json', orient='split') print(df)
输出:
name age
row1 Alice 25
row2 Bob 30
处理嵌套JSON:orient='table'
或自定义解析
实际数据中常包含嵌套结构(如字典列表中的字典),此时需结合orient='table'
或分步处理。
示例JSON(nested.json
):
[ {"name": "Alice", "info": {"age": 25, "city": "New York"}}, {"name": "Bob", "info": {"age": 30, "city": "London"}} ]
方法1:orient='table'
(推荐)
orient='table'
会尝试将嵌套JSON转换为“规范化”的DataFrame,展开嵌套字典。
df = pd.read_json('nested.json', orient='table') print(df)
输出:
name info.age info.city
0 Alice 25 New York
1 Bob 30 London
嵌套字典的键会作为新列(格式为父层.子层
),值对应数据。
方法2:手动展开嵌套列
若orient='table'
不满足需求,可先读取JSON,再用apply()
或json_normalize()
展开嵌套字段。
from pandas import json_normalize # 先读取为列表(假设JSON是records格式) data = [ {"name": "Alice", "info": {"age": 25, "city": "New York"}}, {"name": "Bob", "info": {"age": 30, "city": "London"}} ] df = pd.DataFrame(data) # 展开info列 df = pd.concat([df.drop('info', axis=1), df['info'].apply(pd.Series)], axis=1) print(df)
输出同orient='table'
。
读取行式JSON(JSON Lines):lines=True
在日志处理、大数据场景中,数据常以“每行一个JSON对象”的格式存储(称为JSON Lines或`.jsonl
还没有评论,来说两句吧...