Pandas JSON用法详解

在数据分析和处理中,pandas 是一个强大的 Python 库,它提供了丰富的功能来处理 JSON 数据。下面将从读取、写入、处理 JSON 数据等方面详细介绍 pandas 对 JSON 的使用。

1. 读取 JSON 数据

pandas 提供了 read_json() 函数来读取 JSON 文件或 JSON 字符串。

读取 JSON 文件

import pandas as pd

# 从文件中读取 JSON 数据
df = pd.read_json('data.json')
print(df)

读取 JSON 字符串

import pandas as pd

# 定义一个 JSON 字符串
json_str = '[{"name": "Alice", "age": 25}, {"name": "Bob", "age": 30}]'
df = pd.read_json(json_str)
print(df)

参数说明

  • orient:指定 JSON 数据的格式方向,常见的值有:
    • 'records':JSON 是一个记录列表,每个记录是一个字典,这是默认值。
    • 'index':JSON 的键是索引,值是列。
    • 'columns':JSON 的键是列,值是索引。
    • 'values':JSON 是一个二维数组,每一行是一个记录。
import pandas as pd

# 示例 JSON 数据
json_data = {
    "index": ["row1", "row2"],
    "columns": ["col1", "col2"],
    "data": [[1, 2], [3, 4]]
}
# 使用 orient='split' 读取
df = pd.read_json(pd.io.json.dumps(json_data), orient='split')
print(df)

2. 写入 JSON 数据

pandas 的 DataFrame 对象提供了 to_json() 方法来将数据写入 JSON 格式。
import pandas as pd

# 创建一个 DataFrame
data = {
    'name': ['Alice', 'Bob'],
    'age': [25, 30]
}
df = pd.DataFrame(data)

# 将 DataFrame 写入 JSON 文件
df.to_json('output.json', orient='records')

参数说明

  • orient:与 read_json() 中的 orient 参数类似,指定输出的 JSON 格式方向。
  • indent:指定缩进的空格数,用于美化输出的 JSON 格式。
import pandas as pd

# 创建一个 DataFrame
data = {
    'name': ['Alice', 'Bob'],
    'age': [25, 30]
}
df = pd.DataFrame(data)

# 将 DataFrame 写入 JSON 文件,美化格式
df.to_json('output_pretty.json', orient='records', indent=4)

3. 处理嵌套 JSON 数据

当 JSON 数据包含嵌套结构时,可以使用 json_normalize() 函数将其扁平化。
import pandas as pd
import json

# 示例嵌套 JSON 数据
json_str = '[{"name": "Alice", "info": {"city": "New York", "country": "USA"}}, {"name": "Bob", "info": {"city": "London", "country": "UK"}}]'
data = json.loads(json_str)

# 扁平化嵌套 JSON 数据
df = pd.json_normalize(data)
print(df)

参数说明

  • record_path:指定要展开的嵌套列表的路径。
  • meta:指定要保留的元数据列。
import pandas as pd
import json

# 示例嵌套 JSON 数据
json_str = '{"students": [{"name": "Alice", "scores": [80, 90, 70]}, {"name": "Bob", "scores": [85, 95, 75]}]}'
data = json.loads(json_str)

# 展开 scores 列表
df = pd.json_normalize(data['students'], record_path='scores', meta='name')
print(df)

4. JSON 数据的筛选和转换

读取 JSON 数据后,可以使用 pandas 的各种方法对数据进行筛选和转换。
import pandas as pd

# 示例 JSON 数据
json_str = '[{"name": "Alice", "age": 25}, {"name": "Bob", "age": 30}]'
df = pd.read_json(json_str)

# 筛选年龄大于 25 的记录
filtered_df = df[df['age'] > 25]
print(filtered_df)

# 对年龄列进行转换
df['age_plus_1'] = df['age'] + 1
print(df)

5. 处理复杂 JSON 结构

对于非常复杂的 JSON 结构,可能需要多次使用 json_normalize() 或结合其他方法进行处理。例如,当 JSON 数据中既有嵌套列表又有嵌套字典时,可以分步处理。
import pandas as pd
import json

# 示例复杂 JSON 数据
json_str = '[{"name": "Alice", "courses": [{"course_name": "Math", "grades": [80, 90]}, {"course_name": "English", "grades": [70, 85]}]}, {"name": "Bob", "courses": [{"course_name": "Math", "grades": [85, 95]}, {"course_name": "English", "grades": [75, 80]}]}]'
data = json.loads(json_str)

# 第一步:展开 courses 列表
df1 = pd.json_normalize(data, record_path='courses', meta='name')

# 第二步:展开 grades 列表
df2 = pd.json_normalize(df1.to_dict(orient='records'), record_path='grades', meta=['name', 'course_name'])
print(df2)

通过以上方法,可以使用 pandas 高效地读取、写入和处理各种 JSON 数据。

posted on 2025-03-22 19:07  阿陶学长  阅读(184)  评论(0)    收藏  举报