熊猫 |解析 JSON 数据集
使用 pandas 解析 JSON 数据集要方便得多。 Pandas 允许您将列表列表转换为 Dataframe 并单独指定列名。
JSON 解析器将 JSON 文本转换为另一种表示形式,必须接受所有符合 JSON 语法的文本。它可以接受非 JSON 形式或扩展。一个实现可以设置以下内容:
- 限制它接受的文本大小,
- 最大嵌套深度的限制,
- 限制数字的范围和精度,
- 对字符串的长度和字符内容设置限制。
使用大型 JSON 数据集可能会恶化,尤其是当它们太大而无法放入内存时。在这种情况下,命令行工具和Python的组合可以成为探索和分析数据的有效方法。
导入 JSON 文件:
操作 JSON 是使用Python数据分析库(称为 pandas)完成的。
import pandas as pd
现在您可以使用命令read_json
读取 JSON 并将其保存为 pandas 数据结构。
pandas.read_json (path_or_buf=None, orient = None, typ=’frame’, dtype=True, convert_axes=True, convert_dates=True, keep_default_dates=True, numpy=False, precise_float=False, date_unit=None, encoding=None, lines=False, chunksize=None, compression=’infer’)
import pandas as pd
# Creating Dataframe
df = pd.DataFrame([['a', 'b'], ['c', 'd']],
index =['row 1', 'row 2'],
columns =['col 1', 'col 2'])
# Indication of expected JSON string format
print(df.to_json(orient ='split'))
print(df.to_json(orient ='index'))
{"columns":["col 1", "col 2"],
"index":["row 1", "row 2"],
"data":[["a", "b"], ["c", "d"]]}
{"row 1":{"col 1":"a", "col 2":"b"},
"row 2":{"col 1":"c", "col 2":"d"}}
使用 dataframe.to_json 将对象转换为 JSON字符串:
DataFrame.to_json(path_or_buf=None, orient=None, date_format=None, double_precision=10, force_ascii=True, date_unit=’ms’, default_handler=None, lines=False, compression=’infer’, index=True)
直接从数据集中读取 JSON 文件:
import pandas as pd
data = pd.read_json('http://api.population.io/1.0/population/India/today-and-tomorrow/?format = json')
print(data)
total_population
0 {'date': '2019-03-18', 'population': 1369169250}
1 {'date': '2019-03-19', 'population': 1369211502}
使用 Pandas 进行嵌套 JSON 解析:
嵌套 JSON 文件的扁平化和加载到 Pandas 中可能是耗时且困难的过程。
我们使用嵌套的“'raw_nyc_phil.json.”'从一个嵌套数组创建一个扁平化的 pandas 数据框,然后解压缩一个深度嵌套的数组。
代码#1:
让我们将works列解压缩成一个独立的数据框。我们还将抓住扁平的柱子。
import json
import pandas as pd
from pandas.io.json import json_normalize
with open('https://github.com/a9k00r/python-test/blob/master/raw_nyc_phil.json') as f:
d = json.load(f)
# lets put the data into a pandas df
# clicking on raw_nyc_phil.json under "Input Files"
# tells us parent node is 'programs'
nycphil = json_normalize(d['programs'])
nycphil.head(3)
输出:
代码#2:
让我们使用 json_normaliz 将works 列解压缩成一个独立的数据框。
works_data = json_normalize(data = d['programs'],
record_path ='works',
meta =['id', 'orchestra', 'programID', 'season'])
works_data.head(3)
输出:
代码#3:
让我们通过传递一个列表来展平这里的“独奏者”数据。由于独奏者嵌套在工作中。
soloist_data = json_normalize(data = d['programs'],
record_path =['works', 'soloists'],
meta =['id'])
soloist_data.head(3)
输出: