55_Pandas.DataFrame 转换为 JSON 字符串/文件并保存 (to_json)

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']}}

文章出处登录后可见!

已经登录?立即刷新

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
扎眼的阳光的头像扎眼的阳光普通用户
上一篇 2023年8月16日
下一篇 2023年8月16日

相关推荐