当前位置: 代码网 > it编程>编程语言>Javascript > Pandas JSON的处理使用

Pandas JSON的处理使用

2025年02月14日 Javascript 我要评论
json(javascriptobjectnotation,javascript 对象表示法),是存储和交换文本信息的语法,类似 xml。json 比 xml 更小、更快,更易解析。pandas 提供

json(javascript object notation,javascript 对象表示法),是存储和交换文本信息的语法,类似 xml。json 比 xml 更小、更快,更易解析。pandas 提供了强大的方法来处理 json 格式的数据,支持从 json 文件或字符串中读取数据并将其转换为 dataframe,以及将 dataframe 转换回 json 格式。

操作方法说明
从 json 文件/字符串读取数据pd.read_json()从 json 数据中读取并加载为 dataframe
将 dataframe 转换为 jsondataframe.to_json()将 dataframe 转换为 json 格式的数据,可以指定结构化方式
支持 json 结构化方式orient 参数支持多种结构化方式,如 splitrecordscolumns

pandas 可以很方便的处理 json 数据,本文以 sites.json 为例,内容如下:

[
  {
    "id": "a001",
    "name": "bing",
    "url": "www.bing.com",
    "likes": 61
  },
  {
    "id": "a002",
    "name": "google",
    "url": "www.google.com",
    "likes": 124
  },
  {
    "id": "a003",
    "name": "淘宝",
    "url": "www.taobao.com",
    "likes": 45
  }
]

1 从 json 文件/字符串加载数据

1.1 pd.read_json() - 读取 json 数据

read_json() 用于从 json 格式的数据中读取并加载为一个 dataframe。它支持从 json 文件、json 字符串或 json 网址中加载数据。

df = pd.read_json(
    path_or_buffer,      # json 文件路径、json 字符串或 url
    orient=none,         # json 数据的结构方式,默认是 'columns'
    dtype=none,          # 强制指定列的数据类型
    convert_axes=true,   # 是否转换行列索引
    convert_dates=true,  # 是否将日期解析为日期类型
    keep_default_na=true # 是否保留默认的缺失值标记
)
参数说明默认值
path_or_bufferjson 文件的路径、json 字符串或 url必需参数
orient定义 json 数据的格式方式。常见值有 splitrecordsindexcolumnsvaluesnone(根据文件自动推断)
dtype强制指定列的数据类型none
convert_axes是否将轴转换为合适的数据类型true
convert_dates是否将日期解析为日期类型true
keep_default_na是否保留默认的缺失值标记(如 nantrue

常见的 orient 参数选项:

orient 值json 格式示例描述
split{"index":["a","b"],"columns":["a","b"],"data":[[1,2],[3,4]]}使用键 indexcolumns 和 data 结构
records[{"a":1,"b":2},{"a":3,"b":4}]每个记录是一个字典,表示一行数据
index{"a":{"a":1,"b":2},"b":{"a":3,"b":4}}使用索引为键,值为字典的方式
columns{"a":{"a":1,"b":3},"b":{"a":2,"b":4}}使用列名为键,值为字典的方式
values[[1,2],[3,4]]只返回数据,不包括索引和列名

从 json 文件加载数据,to_string() 用于返回 dataframe 类型的数据,我们也可以直接处理 json 字符串。

import pandas as pd

df = pd.read_json('sites.json')

print(df.to_string())

json 对象与 python 字典具有相同的格式,所以我们可以直接将 python 字典转化为 dataframe 数据:

import pandas as pd

# 字典格式的 json
s = {
    "col1": {"row1": 1, "row2": 2, "row3": 3},
    "col2": {"row1": "x", "row2": "y", "row3": "z"}
}

# 读取 json 转为 dataframe
df = pd.dataframe(s)
print(df)

从 json 字符串加载数据:

from io import stringio

import pandas as pd

# json 字符串
json_data = '''
[
  {"name": "alice", "age": 25, "city": "new york"},
  {"name": "bob", "age": 30, "city": "los angeles"},
  {"name": "charlie", "age": 35, "city": "chicago"}
]
'''

# 从 json 字符串读取数据
df = pd.read_json(stringio(json_data))

print(df)

1.2 内嵌的 json 数据

假设有一组内嵌的 json 数据文件 nested_list.json :

{
    "school_name": "abc primary school",
    "class": "year 1",
    "students": [
    {
        "id": "a001",
        "name": "tom",
        "math": 60,
        "physics": 66,
        "chemistry": 61
    },
    {
        "id": "a002",
        "name": "james",
        "math": 89,
        "physics": 76,
        "chemistry": 51
    },
    {
        "id": "a003",
        "name": "jenny",
        "math": 79,
        "physics": 90,
        "chemistry": 78
    }]
}

使用以下代码格式化完整内容:

import pandas as pd

df = pd.read_json('nested_list.json')

print(df)

这时我们就需要使用到 json_normalize() 方法将内嵌的数据完整的解析出来:

import pandas as pd
import json

# 使用 python json 模块载入数据
with open('nested_list.json', 'r') as f:
    data = json.loads(f.read())

# 展平数据
df_nested_list = pd.json_normalize(data, record_path=['students'])
print(df_nested_list)

data = json.loads(f.read()) 使用 python json 模块载入数据。json_normalize() 使用了参数 record_path 并设置为 ['students'] 用于展开内嵌的 json 数据 students。显示结果还没有包含 school_name 和 class 元素,如果需要展示出来可以使用 meta 参数来显示这些元数据:

import pandas as pd
import json

# 使用 python json 模块载入数据
with open('nested_list.json', 'r') as f:
    data = json.loads(f.read())

# 展平数据
df_nested_list = pd.json_normalize(
    data,
    record_path=['students'],
    meta=['school_name', 'class']
)
print(df_nested_list)

接下来尝试读取更复杂的 json 数据,该数据嵌套了列表和字典,数据文件 nested_mix.json 如下:

{
  "school_name": "local primary school",
  "class": "year 1",
  "info": {
    "president": "john kasich",
    "address": "abc road, london, uk",
    "contacts": {
      "email": "admin@e.com",
      "tel": "123456789"
    }
  },
  "students": [
    {
      "id": "a001",
      "name": "tom",
      "math": 60,
      "physics": 66,
      "chemistry": 61
    },
    {
      "id": "a002",
      "name": "james",
      "math": 89,
      "physics": 76,
      "chemistry": 51
    },
    {
      "id": "a003",
      "name": "jenny",
      "math": 79,
      "physics": 90,
      "chemistry": 78
    }
  ]
}

nested_mix.json 文件转换为 dataframe:

import pandas as pd
import json

# 使用 python json 模块载入数据
with open('nested_mix.json', 'r') as f:
    data = json.loads(f.read())

df = pd.json_normalize(
    data,
    record_path=['students'],
    meta=[
        'class',
        ['info', 'president'],
        ['info', 'contacts', 'tel']
    ]
)

print(df)

1.3 读取内嵌数据中的一组数据

以下是实例文件 nested_deep.json,我们只读取内嵌中的 math 字段:

{
  "school_name": "local primary school",
  "class": "year 1",
  "students": [
    {
      "id": "a001",
      "name": "tom",
      "grade": {
        "math": 60,
        "physics": 66,
        "chemistry": 61
      }
    },
    {
      "id": "a002",
      "name": "james",
      "grade": {
        "math": 89,
        "physics": 76,
        "chemistry": 51
      }
    },
    {
      "id": "a003",
      "name": "jenny",
      "grade": {
        "math": 79,
        "physics": 90,
        "chemistry": 78
      }
    }
  ]
}

这里我们需要使用到 glom 模块来处理数据套嵌,glom 模块允许我们使用 . 来访问内嵌对象的属性。第一次使用我们需要安装 glom:

pip3 install glom
import pandas as pd
from glom import glom

df = pd.read_json('nested_deep.json')

data = df['students'].apply(lambda row: glom(row, 'grade.math'))
print(data)

2 将 dataframe 转换为 json

2.1 dataframe.to_json() - 将 dataframe 转换为 json 数据

to_json() 方法用于将 dataframe 转换为 json 格式的数据,可以指定 json 的结构化方式。语法格式:

df.to_json(
    path_or_buffer=none,    # 输出的文件路径或文件对象,如果是 none 则返回 json 字符串
    orient=none,            # json 格式方式,支持 'split', 'records', 'index', 'columns', 'values'
    date_format=none,       # 日期格式,支持 'epoch', 'iso'
    default_handler=none,   # 自定义非标准类型的处理函数
    lines=false,            # 是否将每行数据作为一行(适用于 'records' 或 'split')
    encoding='utf-8'        # 编码格式
)
参数说明默认值
path_or_buffer输出的文件路径或文件对象,若为 none,则返回 json 字符串none
orient指定 json 格式结构,支持 splitrecordsindexcolumnsvaluesnone(默认是 columns
date_format日期格式,支持 'epoch' 或 'iso' 格式none
default_handler自定义处理非标准类型(如 datetime 等)的处理函数none
lines是否将每行数据作为一行输出(适用于 records 或 splitfalse
encoding输出文件的编码格式'utf-8'
import pandas as pd

# 创建 dataframe
df = pd.dataframe({
    'name': ['alice', 'bob', 'charlie'],
    'age': [25, 30, 35],
    'city': ['new york', 'los angeles', 'chicago']
})

# 将 dataframe 转换为 json 字符串
json_str = df.to_json()

print(json_str)

将 dataframe 转换为 json 文件(指定 orient='records'):

import pandas as pd

# 创建 dataframe
df = pd.dataframe({
    'name': ['alice', 'bob', 'charlie'],
    'age': [25, 30, 35],
    'city': ['new york', 'los angeles', 'chicago']
})

# 将 dataframe 转换为 json 文件,指定 orient='records'
df.to_json('data.json', orient='records', lines=true)

将 dataframe 转换为 json 并指定日期格式:

import pandas as pd

# 创建 dataframe,包含日期数据
df = pd.dataframe({
    'name': ['alice', 'bob', 'charlie'],
    'date': pd.to_datetime(['2021-01-01', '2022-02-01', '2023-03-01']),
    'age': [25, 30, 35]
})

# 将 dataframe 转换为 json,并指定日期格式为 'iso'
json_str = df.to_json(date_format='iso')

print(json_str)

到此这篇关于pandas json的处理使用的文章就介绍到这了,更多相关pandas json内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com