Pandas JSON

JSON(JavaScript Object Notation,JavaScript 对象表示法),是存储和交换文本信息的语法,类似 XML。

JSON 比 XML 更小、更快,更易解析,更多 JSON 内容可以参考 JSON 教程

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

实例

[
   {
   "id": "A001",
   "name": "AY知识库",
   "url": "www.aaronyang.cc",
   "likes": 61
   },
   {
   "id": "A002",
   "name": "Baidu",
   "url": "www.baidu.com",
   "likes": 124
   },
   {
   "id": "A003",
   "name": "淘宝",
   "url": "www.taobao.com",
   "likes": 45
   }
]

实例

import pandas as pd

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

print(df.to_string())

to_string() 用于返回 DataFrame 类型的数据,我们也可以直接处理 JSON 字符串。

实例

import pandas as pd

data =[
{
   "id": "A001",
   "name": "AY知识库",
   "url": "www.aaronyang.cc",
   "likes": 61
   },
   {
   "id": "A002",
   "name": "Baidu",
   "url": "www.baidu.com",
   "likes": 124
   },
   {
   "id": "A003",
   "name": "淘宝",
   "url": "www.taobao.com",
   "likes": 45
   }
]
df = pd.DataFrame(data)

print(df)

以上实例输出结果为:

file

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)

以上实例输出结果为:

      col1 col2
row1     1    x
row2     2    y
row3     3    z

从 URL 中读取 JSON 数据:

实例

import pandas as pd

URL = 'http://61.174.243.28:13541/wp-content/uploads/2023/05/test.json_.txt'
df = pd.read_json(URL)
print(df)

以上实例输出结果为:

file

内嵌的 JSON 数据

假设有一组内嵌的 JSON 数据文件 test.json

test.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('test.json')

print(df)

以上实例输出结果为:

file

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

实例

import pandas as pd
import json

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

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

以上实例输出结果为:

file

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('test.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)

以上实例输出结果为:

file

接下来,让我们尝试读取更复杂的 JSON 数据,该数据嵌套了列表和字典,数据文件 nested_mix.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)

以上实例输出结果为:

file

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

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

nested_deep.json 文件内容

{
    "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)

以上实例输出结果为:

0    60
1    89
2    79
Name: students, dtype: int64

若文章对你有帮助,可以点赞或打赏支持我们。发布者:Aurora,转载请注明出处:http://61.174.243.28:13541/AY-knowledg-hub/pandas-json/

(0)
AuroraAurora站点维系者
上一篇 2023年 5月 16日 下午3:40
下一篇 2023年 5月 16日 下午3:42

相关推荐

  • yum

    文章目录yum补充说明语法选项参数实例 yum 基于RPM的软件包管理器 补充说明 yum命令 是在Fedora和RedHat以及SUSE中基于rpm的软件包管理器,它可以使系统管…

    入门教程 2024年 3月 11日
  • lsattr

    文章目录lsattr补充说明语法选项参数实例 lsattr 查看文件的第二扩展文件系统属性 补充说明 lsattr命令 用于查看文件的第二扩展文件系统属性。 语法 lsattr(选…

    入门教程 2023年 12月 19日
  • ip6tables-restore

    文章目录ip6tables-restore补充说明语法选项 ip6tables-restore 还原ip6tables表 补充说明 ip6tables-restore命令 用来还原…

    入门教程 2023年 12月 19日
  • yes

    文章目录yes补充说明语法参数实例 yes 重复打印指定字符串 补充说明 yes命令 在命令行中输出指定的字符串,直到yes进程被杀死。不带任何参数输入yes命令默认的字符串就是y…

    入门教程 2024年 3月 11日
  • clear

    文章目录clear补充说明语法实例 clear 清除当前屏幕终端上的任何信息 补充说明 clear命令 用于清除当前屏幕终端上的任何信息。 语法 clear 实例 直接输入clea…

    入门教程 2023年 12月 7日
  • atop

    文章目录atop补充说明语法说明proc字段指示进程总数zombie字段指示僵尸进程的数量exit字段指示atop采样周期期间退出的进程数量atop日志相关资料 atop 监控Li…

    入门教程 2023年 12月 6日
  • useradd

    文章目录useradd补充说明语法选项参数退出值文件实例 useradd 创建的新的系统用户 补充说明 useradd命令 用于Linux中创建的新的系统用户。useradd可用来…

    入门教程 2024年 3月 11日
  • xlsfonts

    文章目录xlsfonts补充说明语法选项 xlsfonts 列出X Server使用的字体 补充说明 xlsfonts命令 列出X Server使用的字体,也能使用范本样式仅列出的…

    入门教程 2024年 3月 11日
  • grep

    文章目录grep补充说明选项规则表达式grep命令常见用法grep递归搜索文件 grep 强大的文本搜索工具 补充说明 grep (global search regular ex…

    入门教程 2023年 12月 14日
  • 使用RINETD对服务器进行端口转发

    文章目录下载软件解压文件到服务器编译配置可参考以下文件进行配置启动端口转发停止端口转发设置开机自启动检查服务是否正常运行帮助文档rinetd: a user-mode port r…

    2021年 8月 6日
Translate »