55_Pandas.DataFrame 转换为 JSON 字符串/文件并保存 (to_json)
使用pandas.DataFrame的方法to_json(),可以将pandas.DataFrame转为JSON格式字符串(str类型)或者输出(保存)为JSON格式文件。
在此,对以下内容进行说明。有关其他参数,请参阅上面的官方文档。
- pandas.DataFrame.to_json() 的基本用法
- 转换为JSON格式字符串
- 输出(保存)为JSON格式文件
- 文件压缩:参数压缩
- 指定格式:参数
orient
split
records
JSON Lines(.jsonl)
index
columns
(默认值)values
table
如果要将 pandas.DataFrame 转换为字典(dict 类型),请使用 to_dict() 方法。
- 54_Pandas将DataFrame、Series转换为字典 (to_dict)
另外,用pandas读写(输入/输出)CSV文件和Excel文件见以下文章。
- 03_Pandas读取csv/tsv文件(read_csv,read_table)
- 34_Pandas对CSV文件内容的导出和添加(to_csv)
- 50_Pandas读取 Excel 文件 (xlsx, xls)
- 51_Pandas (to_excel) 编写 Excel 文件 (xlsx, xls)
这里以创建如下 pandas.DataFrame 为例。
import pandas as pd
import pprint
import json
df = pd.DataFrame({'col1': [1, 2, 3], 'col2': ['a', 'x', '啊']},
index=['row1', 'row2', 'row3'])
print(df)
# col1 col2
# row1 1 a
# row2 2 x
# row3 3 啊
pandas.DataFrame.to_json() 的基本用法
转换为JSON格式字符串
当你从 pandas.DataFrame 调用 to_json() 方法时,默认情况下它被转换为 JSON 格式字符串(str 类型),如下所示。
print(df.to_json())
# {"col1":{"row1":1,"row2":2,"row3":3},"col2":{"row1":"a","row2":"x","row3":"\u554a"}}
print(type(df.to_json()))
# <class 'str'>
非 ascii 字符(例如双字节字符)是 Unicode 转义的。如果参数 force_ascii=False,则不会进行 Unicode 转义。
输出(保存)为JSON格式文件
如果您将路径指定为第一个参数,它将被保存为一个文件。未指定路径时输出的字符串按原样写入文件。
path = 'data/sample_from_pandas_columns.json'
df.to_json(path)
with open(path) as f:
s = f.read()
print(s)
print(type(s))
# {"col1":{"row1":1,"row2":2,"row3":3},"col2":{"row1":"a","row2":"x","row3":"\u554a"}}
# <class 'str'>
使用open()读取时,参数encoding=’unicode-escape’会将Unicode转义序列\uXXXX
转换为对应的字符。
with open(path, encoding='unicode-escape') as f:
s = f.read()
print(s)
print(type(s))
# {"col1":{"row1":1,"row2":2,"row3":3},"col2":{"row1":"a","row2":"x","row3":"啊"}}
# <class 'str'>
使用标准库 json 模块的 json.load() 函数作为字典加载。在这种情况下,默认情况下 Unicode 转义序列 \uXXXX
被转换为相应的字符。
with open(path) as f:
d = json.load(f)
print(d)
print(type(d))
# {'col1': {'row1': 1, 'row2': 2, 'row3': 3}, 'col2': {'row1': 'a', 'row2': 'x', 'row3': '啊'}}
# <class 'dict'>
文件压缩:参数压缩
通过指定从 pandas 版本 0.21.0 添加的参数压缩,可以在输出文件时压缩文件。
指定“gzip”、“bz2”、“xz”之一。
df.to_json('data/sample_from_pandas_columns.gz', compression='gzip')
指定格式:参数orient
参数orient可以指定如何将pandas.DataFrame行标签索引、列标签列和值输出为JSON。
在这里,还显示了使用 json.loads() 将输出字符串转换为字典并使用 pprint() 显示的结果。
split
{index -> [index], columns -> [columns], data -> [values]}
print(df.to_json(orient='split'))
# {"columns":["col1","col2"],"index":["row1","row2","row3"],"data":[[1,"a"],[2,"x"],[3,"\u554a"]]}
pprint.pprint(json.loads(df.to_json(orient='split')))
# {'columns': ['col1', 'col2'],
# 'data': [[1, 'a'], [2, 'x'], [3, '啊']],
# 'index': ['row1', 'row2', 'row3']}
records
[{column -> value}, ... , {column -> value}]
print(df.to_json(orient='records'))
# [{"col1":1,"col2":"a"},{"col1":2,"col2":"x"},{"col1":3,"col2":"\u554a"}]
pprint.pprint(json.loads(df.to_json(orient='records')), width=40)
# [{'col1': 1, 'col2': 'a'},
# {'col1': 2, 'col2': 'x'},
# {'col1': 3, 'col2': '啊'}]
JSON Lines(.jsonl)
如果参数 orient=’records,并且参数 lines=True,它将是一个字符串,每个 {column: value} 都有一个换行符。
print(df.to_json(orient='records', lines=True))
# {"col1":1,"col2":"a"}
# {"col1":2,"col2":"x"}
# {"col1":3,"col2":"\u554a"}
index
{index -> {column -> value}}
print(df.to_json(orient='index'))
# {"row1":{"col1":1,"col2":"a"},"row2":{"col1":2,"col2":"x"},"row3":{"col1":3,"col2":"\u554a"}}
pprint.pprint(json.loads(df.to_json(orient='index')))
# {'row1': {'col1': 1, 'col2': 'a'},
# 'row2': {'col1': 2, 'col2': 'x'},
# 'row3': {'col1': 3, 'col2': '啊'}}
columns
(默认值)
{column -> {index -> value}}
如果省略了 orient 参数(默认),则为这种格式。
print(df.to_json(orient='columns'))
# {"col1":{"row1":1,"row2":2,"row3":3},"col2":{"row1":"a","row2":"x","row3":"\u554a"}}
pprint.pprint(json.loads(df.to_json(orient='columns')))
# {'col1': {'row1': 1, 'row2': 2, 'row3': 3},
# 'col2': {'row1': 'a', 'row2': 'x', 'row3': '啊'}}
values
print(df.to_json(orient='values'))
# [[1,"a"],[2,"x"],[3,"\u554a"]]
pprint.pprint(json.loads(df.to_json(orient='values')))
# [[1, 'a'], [2, 'x'], [3, '啊']]
table
一种包含数据结构方案信息的格式。
print(df.to_json(orient='table'))
# {"schema": {"fields":[{"name":"index","type":"string"},{"name":"col1","type":"integer"},{"name":"col2","type":"string"}],"primaryKey":["index"],"pandas_version":"0.20.0"}, "data": [{"index":"row1","col1":1,"col2":"a"},{"index":"row2","col1":2,"col2":"x"},{"index":"row3","col1":3,"col2":"\u554a"}]}
pprint.pprint(json.loads(df.to_json(orient='table')))
# {'data': [{'col1': 1, 'col2': 'a', 'index': 'row1'},
# {'col1': 2, 'col2': 'x', 'index': 'row2'},
# {'col1': 3, 'col2': '啊', 'index': 'row3'}],
# 'schema': {'fields': [{'name': 'index', 'type': 'string'},
# {'name': 'col1', 'type': 'integer'},
# {'name': 'col2', 'type': 'string'}],
# 'pandas_version': '0.20.0',
# 'primaryKey': ['index']}}
文章出处登录后可见!