JSON是广泛用于存储数据和交换的格式。
在使用API调取各种所需的数据时,几乎都是使用json作为数据载体。而往往数据分析的初学者们都是以csv 格式作为主要的练习对象。当真正开始接触现实的数据挖掘和数据清洗时,往往会不知所措。
在本文中,我们将学习如何导入JSON文件,JSON字符串 并将其导入到Pandas dataframe并使用它。
Pandas具有内置功能
read_json()
,可将JSON字符串和文件导入pandas数据帧,而
json_normalize()
函数可与嵌套json一起使用,但由于json的书写格式众多,往往能很直观的理解这个转化过程。
在这篇文章中,我们将以更简单的方式理解这一难点
什么是JSON?
JSON是JavaScript对象表示法的简写。
这是一种文本格式,通常用于在Web上交换数据。
如果你只学过python,那么你可能会发现python中的字典和这个JavaScript的语法十分相像
格式如下:
是的乍一看让人头皮发麻
但是
如果我们合理的使用一些工具对这个 raw data进行一下 格式美化后,json的可读性会强很多:
如果我们把每个{ } 结构当做一个“箱子”,箱子里有这个箱子的主人的所有信息,那么JSON看起来就会像这样:
下面,我们将使用基本的 with open( ) 方法先读取 json 文件:
# importing necessary packgesimport pandas as pdimport json# use original with open() to read(load) json fileswith open("blockbusters.json") as f: data = json.load(f)
我们可以观察一下读取的数据
然而!
JSON数据往往数据看起来比较混乱,嵌套结构也让人们本能的感到有些头晕,所以我个人往往会切片一节json数据,配合网上的json阅读工具(http://jsonviewer.stack.hu/) 进行最初的数据理解:
接着我们可以用 最简单的 pd.DataFrame( )来将我们已经读取了的json数据转化成DataFrame:
df = pd.DataFrame(data)df.head()
Output:
当然,以上步骤完全可用pandas 的 read_json()方法一步到位:
df = pd.read_json("blockbusters.json", orient = "record")df.head()
Output:
想必细心的你已经发现了,在这次读入数据的过程中,我们还调整了一个参数:orient
那么这个orient到底指的是什么意思呢?
orient 参数 是为了指明 我们所输入JSON的格式,在文中一开始我们也说到,json的书写格式众多,而orient 参数对应的json 格式如下表所示:
'split' : dict like {index -> [index], columns -> [columns], data -> [values]}'records' : list like [{column -> value}, ... , {column -> value}]'index' : dict like {index -> {column -> value}}'columns' : dict like {column -> {index -> value}}'values' : just the values array
Series可选参数为:"index"(默认), "split", "records",DataFrame可选参数:"columns"(默认),split","records", "index","values"
现在,让我们了解一下这些orient意味着什么
让我们创建一个索引为r1,r2以及列c1和c2的
df = pd.DataFrame([[1, 2], [3, 4]], index=['r1', 'r2'], columns=['c1', 'c2'])
orient index
df.to_json(orient='index')
输出显示一个带有数据索引作为键的json字符串,即r1和r2
Output:
‘{ “r1”:{“c1”:1,”c2”:2}, ”r2”:{“c1”:3,”c2”:4} }’
orient split
这一次,我们设置同一数据的orient值为split
df.to_json(orient='split')
输出是一个JSON字符串,键作为列、索引和数据,因此基本上它将上述数据帧分为这三个键及其相应的值
'{ "columns":["c1","c2"], "index":["r1","r2"], "data":[[1,2],[3,4]] }'
orient records
如果我们将orient设置为records,那么它将转化成字典列表,每个字典将包含行值。
df.to_json(orient='records')
Output:
data_json3 = data.to_json(orient='records')print(data_json3)df3=pd.read_json(data_json3, orient='records')df3# 结果[{"name":"A","values":123,"describe":"aaaaaaaaaaaaaaaaa"},{"name":"B","values":135,"describe":"bbbbbbbbbbbbb"},{"name":"C","values":146,"describe":"cccccc"}]name values describe0 A 123 aaaaaaaaaaaaaaaaa1 B 135 bbbbbbbbbbbbb2 C 146 cccccc
以上就是对最基础的json 信息读入的一些心得和解释。之后我还会解释很多在使用API的过程中,常见的数据清洗问题