• 如何使用Python 和 Pandas读写JSON文件
  • 发布于 1周前
  • 123 热度
    0 评论
  • 范蓉蓉
  • 21 粉丝 52 篇博客
  •   
在这篇文章中,我们将学习如何使用Python读写JSON文件。在第一部分中,我们将使用Python包json来创建一个JSON文件并写入一个JSON文件。在下一部分中,我们将使用Pandas的 json方法将JSON文件加载到Pandas 数据帧中。在这里,我们将学习如何从本地和一个URL读取JSON文件,以及如何使用Pandas读取一个嵌套的JSON文件。

最后,作为奖励,我们还将学习如何操作Pandas数据帧中的数据、重命名列和使用Seaborn对数据绘制图表。

什么是JSON文件?
JSON是JavaScript对象表示法的缩写,是一种紧凑的、基于文本的格式,用于交换数据。这种格式通常用于通过所谓的Web API来从web服务器下载和存储信息。JSON是一种基于文本的格式,在打开一个JSON文件时,我们将识别出其结构。也就是说,它与Python的字典结构没有太大的不同。

在第一个示例中,我们将使用Python模块json创建一个JSON文件。完成这一步之后,我们将加载此JSON文件。在这个Python JSON教程中,我们首先为我们的数据创建一个字典:
import json

data = {"Sub_ID":["1","2","3","4","5","6","7","8" ],
        "Name":["Erik", "Daniel", "Michael", "Sven",
                "Gary", "Carol","Lisa", "Elisabeth" ],
        "Salary":["723.3", "515.2", "621", "731", 
                  "844.15","558", "642.8", "732.5" ],
        "StartDate":[ "1/1/2011", "7/23/2013", "12/15/2011",
                     "6/11/2013", "3/27/2011","5/21/2012", 
                     "7/30/2013", "6/17/2014"],
        "Department":[ "IT", "Manegement", "IT", "HR", 
                      "Finance", "IT", "Manegement", "IT"],
        "Sex":[ "M", "M", "M", 
              "M", "M", "F", "F", "F"]}

print(data)


保存到JSON文件中
在Python中,有一个模块json允许我们对一个JSON文件内容进行读写。该模块会将JSON格式转换为Python的内部数据结构格式。因此,我们可以像处理Python自己的数据结构一样来处理JSON结构。

Python JSON 示例:
在下面的示例代码中,我们首先导入json模块。导入之后,我们打开一个新文件,并使用dump方法来使用Python写入一个json文件。
import json
with open('data.json', 'w') as outfile:
    json.dump(data, outfile)

如何使用Pandas载入一个 JSON 文件
现在,如果我们要处理这些数据,我们可能希望使用Pandas来将JSON文件加载到一个Pandas数据帧中。这样我们就可以使用Pandas的内置方法来操作数据、进行汇总统计和数据可视化。注意,我们将在本文后面简要讨论这个问题。

Pandas读取 Json示例:

在下一个示例中,我们将使用Pandas的 read_json方法来读取我们前面写入的JSON文件(即data.json)。这是相当简单的,我们先将pandas导入为pd:
import pandas as pd

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

df
当你使用Jupyter Notebook时,输出将如下所示:


使用Pandas操作数据

现在我们已经将JSON文件加载到一个Pandas数据帧中,我们将使用Pandas的inplace方法来修改我们的数据帧。我们先将Sub_ID列设置为索引。
df.set_index('Sub_ID', inplace=True)
df


使用Pandas将JSON 保存到CSV示例

现在,当我们将JSON文件加载到一个数据帧中时,我们可能希望将它保存为另一种格式。例如,我们可能想将它保存为一个CSV文件,我们可以使用Pandas的to_csv方法来实现这一点。如果我们喜欢在文本编辑器或Excel中浏览数据,那么将它存储在一个CSV中可能很有用。

在下面的使用Pandas将JSON 保存到CSV的示例中,我们执行了相同的数据操作方法。
df.to_csv("data.csv")

有关使用Pandas处理CSV文件的更多信息,请参见《Pandas阅读CSV教程》。https://www.marsja.se/pandas-read-csv-tutorial-to-csv/ 

如何从一个URL加载JSON
现在,我们已经看到了创建一个JSON文件、使用Python将其写入硬盘驱动器以及最后使用Pandas读取它是多么容易。但是,正如前面提到的,以JSON格式存储的数据很多时候都在网络上。

因此,在本Python json指南的这一节中,我们将学习如何使用Pandas的 read_json方法从一个URL读取一个JSON文件。大多数情况下,这是相当简单的,我们只需要创建一个指向该URL的字符串变量:
url = "https://api.exchangerate-api.com/v4/latest/USD"
df = pd.read_json(url)
df.head()


从一个URL加载JSON 的第二个示例

当加载一些数据时,使用Pandas的 read_json似乎会在每个单元格中创建一个带有字典的数据帧。处理这些字典(嵌套在字典中)的一种方法是使用Python模块request。这个模块还有一个解析JSON文件的方法。在解析了JSON文件之后,我们将使用json_normalize方法来将此JSON文件转换为一个数据帧。

来自JSON的Pandas数据帧
import requests
from pandas.io.json import json_normalize

url = "https://think.cs.vt.edu/corgis/json/airlines/airlines.json"
resp = requests.get(url=url)

df = json_normalize(resp.json())
df.head()

如上图所示,列名称非常长。当我们稍后准备使用Seaborn创建一个时间数列图时,这是非常不切实际的。我们现在要重命名列,这样它们就会变得易于使用一点。

在下面的代码示例中,我们使用了Pandas的 rename方法和Python模块re。也就是说,我们使用一个正则表达式来从列名称中删除“statistics.# of” 和 “statistics.”。最后,我们还使用str.replace方法将点(" . ")替换为下划线(" _ "):
import re

df.rename(columns=lambda x: re.sub("statistics.# of","",x), 
          inplace=True)
df.rename(columns=lambda x: re.sub("statistics.","",x), 
          inplace=True)

df.columns = df.columns.str.replace("[.]", "_")
df.head()

使用Python包Pyjanitor(感谢Shantanu Oak在评论部分指出这一点)对列进行重命名要更快、更容易。查看如何使用Pandas和Pyjanitor重命名列,以及使用Pyjanitor进行的其他操作:
使用 Python & Pandas的最简单的数据清理方法https://www.marsja.se/easiest-data-cleaning-method-using-python-pandas-pyjanitor/ 

使用Seaborn从JSON数据绘制时间数列图
在本文的最后一个示例中,我们将使用Seaborn创建一个时间数列图。我们从JSON加载到一个数据帧中的数据包含关于延迟和取消的航班的信息。我们将使用Seaborns 的lineplot方法创建一个时间数列图来显示2003年至2016年期间被取消的航班数量,并按航空公司代码进行分组。
%matplotlib inline

import matplotlib.pyplot as plt
import seaborn as sns

fig = plt.figure(figsize=(10, 7))
g = sns.lineplot(x="timeyear", y="flightscancelled", ci=False,
             hue="carriercode", data=df)

g.set_ylabel("Flights Cancelled",fontsize=20)
g.set_xlabel("Year",fontsize=20)


plt.legend(bbox_to_anchor=(1.05, 1), loc=2, borderaxespad=0.)

注意,我们使用set_ylabel和set_xlabel方法更改了字体大小以及x轴和y轴的标签。此外,我们还使用matplotlib中的legend方法移动了图例。

有关使用Python进行探索性数据分析的更多信息:
Python中需要学习的9种数据可视化技术 https://www.marsja.se/python-data-visualization-techniques-you-should-learn-seaborn/ 
使用Python、Pandas和Seaborn进行探索性数据分析 https://www.marsja.se/explorative-data-analysis-with-pandas-scipy-and-seaborn/ 

结论
在这篇文章中,我们学习了如何将数据从一个Python字典写入JSON文件,如何使用Python和Pandas加载该JSON文件。此外,我们还学习了如何使用Pandas将一个JSON文件从一个URL加载到一个数据帧中,如何将一个嵌套的JSON文件读取到一个数据帧中。
用户评论