The to_json
函数在转换时特别有用PandasDataFrame 到 JSON 文件。它允许您转换并返回可编写为 JSON 文件的可序列化对象。
该函数具有多个参数,可提供 JSON(JavaScript 对象表示法)输出的自定义。其中之一是orient
参数,它控制生成的 JSON 的格式。
to_json 的语法和参数
这是语法to_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)
让我们详细看看每个参数:
-
路径或缓冲区– 字符串路径、路径对象或类似文件的对象。如果未指定,结果将以字符串形式返回。
-
orient– 生成的 JSON 的格式。选项包括“拆分”、“记录”、“索引”、“列”、“值”和“表”。如果方向不正确,则会抛出 ValueError,因为其他方向不是列表式的。
-
日期格式– 控制日期时间对象的格式。默认为‘iso’,但你也可以使用‘epoch’=纪元毫秒
‘s’:第二个
‘ms’:毫秒
‘我们’:微秒
“ns”代表纳秒。
-
双精度– 编码浮点值时要使用的小数位数。
-
强制 ASCII– 强制编码字符串为 ASCII。
-
日期单位– 编码的时间单位,控制时间戳和 ISO8601 精度。 “s”、“ms”、“us”或“ns”之一。
-
默认处理程序– 如果无法将对象转换为合适的 JSON 格式,则调用处理程序。 None 将被转换为 null,datetime 对象将被转换为 Unix 时间戳。
-
lines– 如果设置为
True
,JSON 输出将采用行分隔的 JSON 格式。
-
压缩– 要使用的压缩类型。如果未指定,则从文件名推断压缩。
-
index– 是否在 JSON 输出中包含 DataFrame 的索引。
在以下部分中,我们将查看一些使用示例to_json
这些参数有不同的设置。
将 Pandas DataFrame 转换为 JSON 文件
现在,让我们看一个使用示例to_json
将 DataFrame 转换为 JSON 文件。
首先,我们需要创建一个数据框。在本教程中,我们将使用一些示例数据。
import pandas as pd
data = {'Name': ['John', 'Anna', 'Peter'],
'Age': [28, 24, 22],
'City': ['New York', 'London', 'Bangkok']}
df = pd.DataFrame(data)
print(df)
该代码的输出将是:
Name Age City
0 John 28 New York
1 Anna 24 London
2 Peter 22 Bangkok
我们有一个数据框df
包含三列——姓名、年龄和城市。现在让我们使用以下命令将此 DataFrame 转换为 JSON 文件to_json
功能。
df.to_json('data.json')
这会将 DataFrame 写入名为“data.json”的 JSON 文件。生成的 JSON 将如下所示:
{
"Name": {
"0": "John",
"1": "Anna",
"2": "Peter"
},
"Age": {
"0": 28,
"1": 24,
"2": 22
},
"City": {
"0": "New York",
"1": "London",
"2": "Bangkok"
}
}
在此输出中,DataFrame 中的每个列名称都成为 JSON 文件中的键。每个键下的值形成另一个字典,其中键是 DataFrame 中的索引,值是相应的单元格值。
导出到压缩 JSON
The compression
参数允许您直接将 DataFrame 导出到压缩的 JSON 文件。
操作方法如下:
df.to_json('compressed_data.json.gz', compression='gzip')
上面的代码行将 DataFrame 写入名为“compressed_data.json.gz”的压缩 JSON 文件。请注意,当文件名以“.gz”结尾时,Pandas 推断数据应该使用 gzip 进行压缩,即使compression
参数未明确设置为“gzip”。
The compression
参数支持多种类型的压缩,包括“gzip”、“bz2”、“zip”、“xz”。当您处理可以更有效地以压缩格式存储的大型数据集时,此参数非常有用。
探索不同的方向选项
The orient
中的参数to_json
函数允许您自定义生成的 JSON 的格式。让我们探索它提供的不同选项。
可能的选项orient
是“拆分”、“记录”、“索引”、“列”、“值”和“表”。对于“split”、“records”和“table”选项,使用 DataFrame 索引。
请记住在读取 JSON 文件时使用相同的方向读取json.
分裂方向
“分裂”方向是一种特殊的方向。在这种格式中,数据被分为列标题、行索引和数据的不同部分。如果您稍后需要重建 DataFrame,这会特别有用,因为它清楚地分离了 DataFrame 的关键组件。
让我们仔细看看“分裂”方向是如何工作的。
print(df.to_json(orient='split'))
Output:
{"columns":["Name","Age","City"],"index":[0,1,2],"data":[["John",28,"New York"],["Anna",24,"London"],["Peter",22,"Bangkok"]]}
在“split”格式中,JSON 输出由三个主要部分组成:
- “columns”:这是 DataFrame 的列名称的列表。
- “index”:这是 DataFrame 行索引的列表。
- “data”:这是一个列表列表,其中每个子列表代表 DataFrame 中的一行数据。
此结构确保保留重建原始 DataFrame 的所有必要信息。
由于此功能,在存储 DataFrame 数据以供以后使用时经常使用“拆分”方向。
记录方向
在这种情况下,DataFrame 的每一行都作为列表中单独的 JSON 对象输出。
以下是如何使用“记录”方向:
print(df.to_json(orient='records'))
Output:
[{"Name":"John","Age":28,"City":"New York"},{"Name":"Anna","Age":24,"City":"London"},{"Name":"Peter","Age":22,"City":"Bangkok"}]
在“记录”格式中,输出 JSON 是对象列表。每个对象代表 DataFrame 中的一行,其中每个键值对对应于该行中的一列及其值。
“记录”格式的优点之一是其可读性。
索引方向
在这个方向上,DataFrame 的每一行都呈现为一个 JSON 对象,DataFrame 的索引用作外部 JSON 对象中的键。
这是“索引”方向的示例:
print(df.to_json(orient='index'))
Output:
{"0":{"Name":"John","Age":28,"City":"New York"},"1":{"Name":"Anna","Age":24,"City":"London"},"2":{"Name":"Peter","Age":22,"City":"Bangkok"}}
在“index”格式中,每个外键代表 DataFrame 中的一个索引,其对应的值是一个 JSON 对象,其中包含表示该行中的数据的列值对。
当 DataFrame 中的索引携带需要在 JSON 结构中维护的重要信息时,此格式非常有用。
例如,如果索引表示记录的唯一标识符,则“索引”方向会保留该连接。
列方向
在这个方向上,JSON 输出按列组织,DataFrame 的每一列都成为 JSON 对象中的键值对。
让我们看看“列”方向的样子:
print(df.to_json(orient='columns'))
Output:
{"Name":{"0":"John","1":"Anna","2":"Peter"},"Age":{"0":28,"1":24,"2":22},"City":{"0":"New York","1":"London","2":"Bangkok"}}
在“列”格式中,JSON 对象中的每个键代表 DataFrame 中的一列,值是另一个 JSON 对象。该内部对象的键是 DataFrame 的索引,值是相应的单元格值。
当您想要逐列处理数据时,“列”方向尤其有用。
价值观导向
在这个方向上,输出是一个包含 DataFrame 值的 JSON 数组。
这是一个例子:
print(df.to_json(orient='columns'))
Output:
[["John",28,"New York"],["Anna",24,"London"],["Peter",22,"Bangkok"]]
正如您所看到的,输出是一个 JSON 数组数组,其中每个子数组代表 DataFrame 的一行。
桌子方向
“表格”方向是一个独特的选项,它不仅包含数据,还包含有关 DataFrame 的一些元信息。
它包括有关所用 Pandas 的字段名称、类型和版本的详细信息。
以下是如何使用“桌子”方向:
print(df.to_json(orient='table'))
Output:
{"schema": {"fields":[{"name":"index","type":"integer"},{"name":"Name","type":"string"},{"name":"Age","type":"integer"},{"name":"City","type":"string"}],"primaryKey":["index"],"pandas_version":"0.20.0"}, "data": [{"index":0,"Name":"John","Age":28,"City":"New York"},{"index":1,"Name":"Anna","Age":24,"City":"London"},{"index":2,"Name":"Peter","Age":22,"City":"Bangkok"}]}
在“table”格式中,输出 JSON 包含两个主要部分:
当您想要跟踪 DataFrame 中的数据类型时,“表”格式非常有用,特别是在不同系统或用户之间共享数据时,此元信息可以帮助保持一致性和理解。
浮点数精度
默认情况下,Pandas 对浮点数使用最多 15 位小数的精度。
您可以使用以下命令控制浮点数的精度double_precision
的参数to_json
功能。
让我们创建一个带有浮点数的 DataFrame 并将其转换为具有不同精度级别的 JSON:
import pandas as pd
data = {'A': [1.123456789], 'B': [2.123456789], 'C': [3.123456789]}
df = pd.DataFrame(data)
print(df.to_json(orient='split', double_precision=2))
Output:
{"columns":["A","B","C"],"index":[0],"data":[[1.12,2.12,3.12]]}
在上面的例子中,double_precision
参数设置为 2。这会将输出 JSON 中的浮点数精度限制为小数点后 2 位。
当您想要减小文件大小或使输出更具可读性时,控制精度非常有用。
处理日期格式
您可以使用date_format
参数输入to_json
函数将日期时间数据格式化为两种不同的格式:“epoch”和“iso”。
让我们创建一个包含日期时间数据的 DataFrame 并使用这两个选项将其转换为 JSON:
import pandas as pd
from datetime import datetime
data = {'Date': [datetime(2022, 1, 1), datetime(2022, 2, 1), datetime(2022, 3, 1)]}
df = pd.DataFrame(data)
# Using the 'epoch' format
print(df.to_json(date_format='epoch'))
# Using the 'iso' format
print(df.to_json(date_format='iso'))
Output:
{"Date":{"0":1640995200000,"1":1643673600000,"2":1645910400000}}
{"Date":{"0":"2022-01-01T00:00:00.000Z","1":"2022-02-01T00:00:00.000Z","2":"2022-03-01T00:00:00.000Z"}}
正如您所看到的,使用“epoch”时,日期时间对象将转换为 UNIX 时间戳。
但是,使用“iso”,日期时间对象将转换为更具可读性的 ISO 格式。
进一步阅读
https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.to_json.html