存储与加载 JSON 文件
JSON (JavaScript Object Notation) 是一种基于 JavaScript 语法子集的开放标准数据交换格式 ,采用完全独立于编程语言的文本格式,易于阅读编写和机器解析生成,并有效地提升网络传输效率。
JSON 语法规则中,以键/值对 (key/value pair) 的方式用来保存对象,键/值对组合中的键名写在前面并用双引号 “” 包裹,使用冒号 : 分隔,然后紧接着值,而对象和数组是比较常用的两种数据类型:
- 花括号保存对象 - {“obj” : ‘value’}
- 方括号保存数组而数据由逗号分隔 - [1, 2, 3] 或 [‘a’, ‘b’, ‘c’]
以下实例将上节的数据框转换成 JSON 字符串,读取 CSV 文件,并列出三行,每行四栏,当转换成 JSON 格式时,可以发现回传内容为字符串格式,以栏 (columns) 为主,共有四个对象,分别如下:
{
"Date":{"0":"2020\\/1\\/1 0:00","1":"2020\\/1\\/1 0:15","2":"2020\\/1\\/1 0:30"},
"compteur_100054073":{"0":0,"1":0,"2":0},
"compteur_100052606":{"0":0,"1":0,"2":0},
"compteur_100003032":{"0":0,"1":1,"2":0}
}
实例
import pandas as pd
dataDir = './data/comptage_velo_2020.csv'
df = pd.read_csv(dataDir, nrows=10)
part = df.iloc[:3,:4]
print(part,"\n")
print(part.to_json())
输出结果为:
Date compteur_100054073 compteur_100052606 compteur_100003032
0 2020/1/1 0:00 0 0 0
1 2020/1/1 0:15 0 0 1
2 2020/1/1 0:30 0 0 0
'{"Date":{"0":"2020\\/1\\/1 0:00","1":"2020\\/1\\/1 0:15","2":"2020\\/1\\/1 0:30"},"compteur_100054073":{"0":0,"1":0,"2":0},"compteur_100052606":{"0":0,"1":0,"2":0},"compteur_100003032":{"0":0,"1":1,"2":0}}'
因此,可以利用 orient 这个参数来决定数据框转换 JSON 的格式
- columns: 面向列,默认是 DataFrame 来作为嵌套的 JSON 对象,且列标签充当主索引。
- index: 面向索引,默认是 Series 来作为嵌套的 JSON 对象,索引标签是主键:
- records: 面向记录,序列化数据为一列 JSON 数组,数组内是 列标签 -> 值的记录,索引标签不包括在内。
- values: 面向值,序列化为嵌套的 JSON 数组值,列和索引标签不包括在内。
- split: 面向切分,序列化成一个 JSON 对象,它包括单项的值、索引和列标签。
实例
print("面向列", part.to_json(orient="columns"),"\n")
print("面向索引", part.to_json(orient="index"),"\n")
print("面向记录", part.to_json(orient="records"),"\n")
print("面向值", part.to_json(orient="values"),"\n")
print("面向切分", part.to_json(orient="split"),"\n")
输出结果为:
面向列 {"Date":{"0":"2020\/1\/1 0:00","1":"2020\/1\/1 0:15","2":"2020\/1\/1 0:30"},"compteur_100054073":{"0":0,"1":0,"2":0},"compteur_100052606":{"0":0,"1":0,"2":0},"compteur_100003032":{"0":0,"1":1,"2":0}}
面向索引 {"0":{"Date":"2020\/1\/1 0:00","compteur_100054073":0,"compteur_100052606":0,"compteur_100003032":0},"1":{"Date":"2020\/1\/1 0:15","compteur_100054073":0,"compteur_100052606":0,"compteur_100003032":1},"2":{"Date":"2020\/1\/1 0:30","compteur_100054073":0,"compteur_100052606":0,"compteur_100003032":0}}
面向记录 [{"Date":"2020\/1\/1 0:00","compteur_100054073":0,"compteur_100052606":0,"compteur_100003032":0},{"Date":"2020\/1\/1 0:15","compteur_100054073":0,"compteur_100052606":0,"compteur_100003032":1},{"Date":"2020\/1\/1 0:30","compteur_100054073":0,"compteur_100052606":0,"compteur_100003032":0}]
面向值 [["2020\/1\/1 0:00",0,0,0],["2020\/1\/1 0:15",0,0,1],["2020\/1\/1 0:30",0,0,0]]
面向切分 {"columns":["Date","compteur_100054073","compteur_100052606","compteur_100003032"],"index":[0,1,2],"data":[["2020\/1\/1 0:00",0,0,0],["2020\/1\/1 0:15",0,0,1],["2020\/1\/1 0:30",0,0,0]]}
接着将数据框存入 JSON 格式的文档中,从下例来看,要以面向列的方式来存储,读取时才是存入时的形状。
实例
part.to_json("./data/convert1.json", orient="columns")
part.to_json("./data/convert2.json", orient="index")
print(pd.read_json("./data/convert1.json"))
print(pd.read_json("./data/convert2.json"))
输出结果为:
Date compteur_100054073 compteur_100052606 compteur_100003032
0 2020-01-01 00:00:00 0 0 0
1 2020-01-01 00:15:00 0 0 1
2 2020-01-01 00:30:00 0 0 0
0 1 2
Date 2020/1/1 0:00 2020/1/1 0:15 2020/1/1 0:30
compteur_100054073 0 0 0
compteur_100052606 0 0 0
compteur_100003032 0 1 0