56_Pandas读取 JSON 字符串/文件 (read_json)

本文介绍了pandas的read_json函数,用于读取JSON字符串和文件到DataFrame,支持压缩文件和JSON行格式。通过调整orient参数,可处理不同结构的JSON数据,转换为CSV或其他分析操作。同时,文章提到了处理部分JSON数据的方法,涉及json模块的使用。
摘要由CSDN通过智能技术生成

56_Pandas读取 JSON 字符串/文件 (read_json)

使用pandas.read_json()函数,可以将JSON格式字符串(str类型)和文件读取为pandas.DataFrame。它还支持 JSON 行 (.jsonl)。

读取成pandas.DataFrame后,可以做各种数据分析,也可以用to_csv()方法保存成csv文件,这样就可以很方便的通过pandas将JSON文件转为CSV文件。

在此,对以下内容进行说明。

  • pandas.read_json() 的基本用法
    • 读取 JSON 格式字符串
    • 读取JSON格式文件
      • 读取压缩文件:参数compression
  • 指定格式:参数orient
  • 读取 JSON 行 (.jsonl)
  • 读取 JSON 字符串/文件的一部分

pandas.read_json() 的基本用法

用作示例的字符串和文件是在以下文章中创建的。

读取 JSON 格式字符串

如果将 JSON 格式的字符串传递给 pandas.read_json() 函数的第一个参数,该字符串将被转换为 pandas.DataFrame。

import pandas as pd
import json

s = '{"col1":{"row1":1,"row2":2,"row3":3},"col2":{"row1":"a","row2":"x","row3":"\u554a"}}'

df_s = pd.read_json(s)

print(df_s)
#       col1 col2
# row1     1    a
# row2     2    x
# row3     3    啊

将原始字符串中的 Unicode 转义序列 \uXXXX 转换为相应的字符。 注意JSON字符串中的引号必须是双引号"。单引号’会导致错误(ValueError)。

s_single_quote = "{'col1':{'row1':1,'row2':2,'row3':3},'col2':{'row1':'a','row2':'x','row3':'\u554a'}}"

# df_s_single_quote = pd.read_json(s_single_quote)
# ValueError: Expected object or value

对于使用单引号 ’ 的字符串,使用字符串方法 replace() 将单引号 ’ 替换为双引号 "。

print(pd.read_json(s_single_quote.replace("'", '"')))
#       col1 col2
# row1     1    a
# row2     2    x
# row3     3    啊

读取JSON格式文件

如果将 JSON 格式文件路径传递给 pandas.read_json() 函数的第一个参数,该文件将被读取为 pandas.DataFrame。

df_f = pd.read_json('data/sample_from_pandas_columns.json')

print(df_f)
#       col1 col2
# row1     1    a
# row2     2    x
# row3     3    啊

读取压缩文件:参数compression

pandas 0.21.0版本加入了参数compression,指定’gzip’, ‘bz2’, ‘zip’, 'xz’可以直接读取压缩文件。

如果扩展名是.gz、.bz2、.zip、.xz,设置compression='infer’会自动选择对应的压缩方式。

df_gzip = pd.read_json('data/sample_from_pandas_columns.gz', compression='infer')

print(df_gzip)
#       col1 col2
# row1     1    a
# row2     2    x
# row3     3    啊

请注意,这仅适用于压缩的单个文件,无法读取包含多个文件的 zip。

指定格式:参数orient

pandas.DataFrame的行标签index、column标签column、value值如何赋值JSON的内容有以下几种格式。

  • ‘split’
    • {index -> [index], columns -> [columns], data -> [values]}
  • ‘records’
    • [{column -> value}, … , {column -> value}]
  • ‘index’
    • {index -> {column -> value}}
  • ‘columns’(default)
    • {column -> {index -> value}}
  • ‘values’
    • [values]

有关实际示例,请参阅下面的文章。

注意,如果要读取的字符串或文件的格式与orient参数中指定的格式不同,会导致行列互换或出错。

df_s_index = pd.read_json(s, orient='index')

print(df_s_index)
#      row1 row2 row3
# col1    1    2    3
# col2    a    x    啊

# df_s_split = pd.read_json(s, orient='split')
# ValueError: JSON data had unexpected key(s): col2, col1

读取 JSON 行 (.jsonl)

JSON 行 (.jsonl) 是用换行符分隔的 JSON。

如果参数 orient=‘records’ 和参数 lines=True,您可以使用 pandas.read_json() 读取 JSON 行 (.jsonl)。

s_jsonl = '''{"col1":1,"col2":"a"}
{"col1":2,"col2":"x"}
{"col1":3,"col2":"\u554a"}'''

print(s_jsonl)
# {"col1":1,"col2":"a"}
# {"col1":2,"col2":"x"}
# {"col1":3,"col2":"啊"}

df_s_jsonl = pd.read_json(s_jsonl, orient='records', lines=True)

print(df_s_jsonl)
#    col1 col2
# 0     1    a
# 1     2    x
# 2     3    啊

要读取 JSONL 文件,只需在第一个参数中指定文件路径,如上例所示。

读取 JSON 字符串/文件的一部分

事实上,可以通过Web API等获取的JSON除了作为pandas.DataFrame读取的数据之外还有其他信息,因此在很多情况下不能直接应用pandas.read_json()。

在这种情况下,可以按以下流程阅读。可能有更好的方法。
1.使用标准库json模块的json.loads()和json.load()将JSON字符串和文件作为
2.字典读取 从字典中提取你想读的部分
3.使用 json.dumps() 将提取的部分转换为字符串
4.将字符串传递给 pandas.read_json()

以下面的嵌套 JSON 字符串为例。

s_nested = '{"OTHER": "x", "DATA": {"col1":{"row1":1,"row2":2},"col2":{"row1":"a","row2":"x"}}}'

如果按原样传递给 pandas.read_json() ,它将如下所示。

print(pd.read_json(s_nested))
#                             DATA OTHER
# col1      {'row1': 1, 'row2': 2}     x
# col2  {'row1': 'a', 'row2': 'x'}     x

首先,使用 json.loads() 将其转换为字典。 json.load() 加载文件。

d = json.loads(s_nested)

print(d)
# {'OTHER': 'x', 'DATA': {'col1': {'row1': 1, 'row2': 2}, 'col2': {'row1': 'a', 'row2': 'x'}}}

print(type(d))
# <class 'dict'>

从字典中提取要读取的部分作为 pandas.DataFrame。如果嵌套很深,则重复 [key name] [key name]。

d_target = d['DATA']

print(d_target)
# {'col1': {'row1': 1, 'row2': 2}, 'col2': {'row1': 'a', 'row2': 'x'}}

print(type(d_target))
# <class 'dict'>

使用 json.dumps() 转换为字符串。

s_target = json.dumps(d_target)

print(s_target)
# {"col1": {"row1": 1, "row2": 2}, "col2": {"row1": "a", "row2": "x"}}

print(type(s_target))
# <class 'str'>

传递给 pandas.read_json()。根据格式指定参数方向。示例默认值(orient=‘columns’)。

df_target = pd.read_json(s_target)

print(df_target)
#       col1 col2
# row1     1    a
# row2     2    x

一起写也OK了。

df_target2 = pd.read_json(json.dumps(json.loads(s_nested)['DATA']))

print(df_target2)
#       col1 col2
# row1     1    a
# row2     2    x

如果你要阅读的部分是orient=‘records’(字典列表)格式,你可以使用pandas.io.json.json_normalize()将字典列表直接转换为pandas.DataFrame。

pandas库提供了一个函数read_json()用于读取JSON文件。如果将JSON格式文件路径作为read_json()函数的第一个参数传递,该文件将被读取pandas.DataFrame。例如,可以使用以下代码读取JSON文件并将其转换为DataFrame: ```python import pandas as pd df = pd.read_json('data/sample.json') print(df) ``` 这将读取名为'sample.json'的JSON文件,并将其转换为DataFrame对象。然后,使用print()函数打印DataFrame的内容。请注意,在这个示例中,假设JSON文件的结构与示例中的结构相似。 另外,read_json()函数还支持读取压缩的JSON文件,可以通过compression参数指定压缩格式。例如,可以使用以下代码读取名为'sample.gz'的压缩JSON文件: ```python import pandas as pd df = pd.read_json('data/sample.gz', compression='gzip') print(df) ``` 通过在read_json()函数中指定compression参数为'gzip',可以成功读取gzip压缩的JSON文件。 总结起来,pandas库的read_json()函数提供了一种方便的方式来读取JSON文件,并将其转换为DataFrame对象,方便进一步进行数据处理和分析。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [56_Pandas读取 JSON 字符串/文件 (read_json)](https://blog.csdn.net/qq_18351157/article/details/128555163)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值