在本教程中,我们将学习如何将JSON对象转化为Pandas数据框架,以及反过来。对于这些方法,我们将看看Pandas 的函数read_json() 和to_json() 。在Pandas中处理JSON对象是一项非常重要的技能,因为我们经常发现以JSON格式存储的数据。
当你读完这篇文章时,请随时观看相关文章的视频教程。
什么是JSON?
在我们开始使用实际的Pandas函数之前,让我们看一下JSON代表什么。这个词 ***"JSON"***是一个简短的词,表示 "JavaScript对象符号".它是一种以有组织的方式存储和传输各种信息的方式。JSON使数据非常容易阅读和访问。它经常被用于从服务器向网站发送信息。
为了加深我们对JSON的理解,让我们看一个例子。
{
"name": "Luke",
"age": 31,
"married": true,
"children": [
{
"name": "Ann",
"age": 12
},
{
"name": "Tom",
"age": 8
}
]
}
这是一个典型的JSON 对象。一个新的对象以一个大括号开始。数据显示为成对的属性 和值。例如,"name"是一个属性,"Luke"是该属性的值。值可以是任何数据类型:一个字符串、一个布尔值、一个整数或浮点数,等等。它也可以是一个包含更多JSON对象的数组。在这个例子中,"children "属性的值是一个包含两个JSON对象的数组。
现在我们知道了JSON对象是什么样子的,现在是时候看看Pandas函数来处理这些对象了。
将JSON对象转换为Pandas数据框
在这一部分,我们将看到如何将JSON对象转化为Pandas数据框架。我们将使用一些具有不同格式的JSON文件的例子,看看我们如何以不同的方式应用 [read_json()](https://blog.finxter.com/how-to-get-json-from-url-in-python/ "How to Get JSON from URL in Python?")函数的几种不同方式。要想详细了解read_json() 函数的所有可能性,请查看官方文档。
我们使用的第一个JSON对象看起来像这样。
{
"columns": [
"length",
"height"
],
"index": [
"fish",
"dog"
],
"data": [
[
3,
1
],
[
5,
3
]
]
}
这个JSON对象有三个属性。"columns", "index", 和 "data".因此,正如其名称所示,"columns"属性包含我们创建的数据框架的列标签,"index"属性包含各自的索引标签,"data"属性包含数据框架的数据。
现在,我们前往编码部分,开始使用Pandas。
import pandas as pd
df1 = pd.read_json('C:\Projects\Finxter articles example code\data_split.json', orient="split")
新创建的DataFrame看起来是这样的。
| 长度 | 高度 | |
| 鱼 | 3 | 1 |
| 狗 | 5 | 3 |
首先,我们导入Pandas。然后,我们使用read_json() 函数创建一个新的数据框架。在这个函数中,我们传入JSON文件的存储路径。这里的关键部分是接下来的 "orient" 参数。这个参数希望是一个字符串,并且是一个预期的JSON字符串格式的指示。我们给它赋值 "split" ,这意味着JSON格式是类似于字典的,有这种格式。
{index -> [index], columns -> [columns], data -> [values]}
当然,JSON文件也可以有其他格式。在接下来的步骤中,我们将看看这个JSON文件。
[ { "length":3, "height":1 }, { "length":5, "height":3 }]
在Pandas中,我们创建另一个数据框。
df2 = pd.read_json("C:\Projects\Finxter articles example code\data_records.json", orient="records")
| 长度 | 高度 | |
| 0 | 3 | 1 |
| 1 | 5 | 3 |
再次,我们通过应用read_json() 函数来创建数据框,并在其中输入JSON文件的路径。这一次,我们把数值 "records" 赋给 "orient" 参数。这个JSON文件的结构像一个列表 (因为它是用方括号包裹的),它有这样的结构。
[{column -> value}, ..., {column -> value}]
我们可以看到,这个数据框没有我们之前的索引标签,因为这里没有涉及到索引标签。幸运的是,Pandas为我们提供了一个函数来重命名索引标签。
df2 = df2.rename(index={0: "fish", 1: "dog"})
| 长度 | 高度 | |
| 鱼 | 3 | 1 |
| 狗 | 5 | 3 |
我们使用 "rename" 函数,并给 "index" 参数分配了一个字典 ,以说明我们要重命名哪些索引。输出显示了一个带有初始索引标签的数据框。
让我们再看一个例子。
{
"fish": {
"length": 3,
"height": 1
},
"dog": {
"length": 5,
"height": 3
}
}
在Pandas中,我们像这样创建新的数据框架。
df3 = pd.read_json("C:\Projects\Finxter articles example code\data_index.json", orient="index")
| 长度 | 高度 | |
| 鱼 | 3 | 1 |
| 狗 | 5 | 3 |
在这里,"orient"参数被分配的值是"index",因为JSON文件是按索引格式化的。JSON文件的结构是这样的。
{index -> {column -> value}}
将数据框转换为JSON对象
我们已经看到了如何将一个JSON对象转换为Pandas数据框架。现在我们来看看另一种方式。将一个数据框架转换为JSON对象。要想详细了解to_json() 函数的所有可能性,请查看官方文档。
为此,我们将使用我们之前创建的数据框。
>>> df3
| 长度 | 高度 | |
| 鱼 | 3 | 1 |
| 狗 | 5 | 3 |
为了将这个数据框转换为JSON对象,我们做了以下工作。
import json
json_string = df3.to_json(orient="split")
parsed = json.loads(json_string)
print(json.dumps(parsed, indent=4))
输出的结果是。
{
"columns": [
"length",
"height"
],
"index": [
"fish",
"dog"
],
"data": [
[
3,
1
],
[
5,
3
]
]
}
首先,我们导入JSON库,用于对JSON对象进行解码和编码。然后,我们使用Pandas函数to_json() ,将数据框"df3"变成一个JSON字符串。因此,我们再次使用 "orient" 参数,就像我们之前在read_json() 函数中做的那样。我们给 "orient" 参数分配字符串 "split" ,因为我们希望JSON对象具有这种结构。
{columns -> [columns], index -> [index], data -> [values]}
在我们成功创建了JSON字符串之后,我们使用JSON库中的loads() 函数,该函数解析了JSON字符串并将其转换为Python字典。最后,我们应用JSON库的函数dumps() ,它将字典转换为JSON对象。在这里,我们传入 "indent" 参数,它定义了JSON对象的缩进。我们打印输出,得到一个我们已经熟悉的JSON对象。
与读取JSON对象一样,我们也可以选择除"split"之外的其他JSON字符串格式。
json_string = df3.to_json(orient="values")
parsed = json.loads(json_string)
print(json.dumps(parsed, indent=4))
输出的结果是。
[ [ 3, 1 ],
[ 5, 3 ]
]
在这里,我们的做法和之前一样,但是我们把 "orient" 参数改为 "values" ,输出的JSON对象显示了一个数组,每一行分别包含更多的数组。这些嵌套的数组包含了这些值。
让我们来看看另一种变化。
json_string = df3.to_json(orient="columns")
parsed = json.loads(json_string)
print(json.dumps(parsed, indent=4))
输出的结果是。
{
"length": {
"fish": 3,
"dog": 5
},
"height": {
"fish": 1,
"dog": 3
}
}
在这个例子中,我们把 "orient" 参数的值改为 "columns"。这样一来,我们就得到了这样的JSON格式。
{column -> {index -> value}}
创建一个表的模式
当从数据框架中创建JSON对象时,也有可能建立一个表模式。为了实现这一点,我们的做法与之前创建JSON对象时基本相同。这一次,我们给 "orient" 参数赋值 "table" 。
json_string = df3.to_json(orient="table")
parsed = json.loads(json_string)
print(json.dumps(parsed, indent=4))
输出结果是。
{
"schema": {
"fields": [
{
"name": "index",
"type": "string"
},
{
"name": "length",
"type": "integer"
},
{
"name": "height",
"type": "integer"
}
],
"primaryKey": [
"index"
],
"pandas_version": "0.20.0"
},
"data": [
{
"index": "fish",
"length": 3,
"height": 1
},
{
"index": "dog",
"length": 5,
"height": 3
}
]
}
这种方法为我们提供了更多的信息,因为我们可以看到,这个JSON对象比我们创建的其他对象要大。它分为两个大的部分:"schema"和"data"部分。
- "
data"部分包含与之前相同的数据,因为我们使用了相同的初始数据框架。 - "
schema" 部分分配了索引和列的数据类型。此外,这部分显示了主键,默认设置为索引级别。它还显示了Pandas的版本,该版本被硬编码为 "0.20.0"。
为了得到我们实际的Pandas版本,我们要这样做。
print(pd.__version__)
# 1.3.4
将JSON对象写到JSON文件中
在上一节中,我们已经看到了如何将数据框架转化为JSON对象。现在我们将学习如何将我们刚刚创建的这些JSON对象写入独立的JSON文件中。这个方法非常直接,看起来像这样。
json_string = df3.to_json(orient="columns")
parsed = json.loads(json_string)
data = json.dumps(parsed, indent=4)
with open("new_data.json", "w") as file:
file.write(data)
我们把一个数据框转化为JSON对象,就像我们之前做的那样。但是这一次,我们不输出JSON对象,而是将其分配给一个叫做"data"的变量。
然后,我们使用 Python 提供给我们的 "with" 语句。"with" 语句使处理文件非常容易。我们创建一个名为*"new_data.json "的新文件。文件扩展名".json "在这里非常重要,它告诉程序我们要创建一个JSON文件。我们使用包含上述对象的 "data" 变量将JSON对象写进这个文件。一旦执行,一个新的文件"new_data.json "*就在工作目录中被创建。当我们打开它时,我们可以在一个单独的文件中看到JSON对象。
摘要
简而言之,在Pandas中处理JSON对象是非常有用的,因为数据经常是以JSON格式存储的。我们学习了如何将JSON对象转化为Pandas数据框架,以及如何将数据框架转化为JSON对象。此外,我们还看到了如何将新创建的JSON对象写入JSON文件中。
更多关于Pandas、Python库、一般Python或其他计算机科学相关主题的教程,请查看Finxter博客页面。
编码愉快!
The postReading and Writing JSON with Pandasfirst appeared onFinxter.