在pandas中使用read_json导入单个记录

2024-10-01 09:23:21 发布

您现在位置:Python中文网/ 问答频道 /正文

我尝试使用函数导入json文件:

sku = pandas.read_json('https://cws01.worldstores.co.uk/api/product.php?product_sku=125T:FT0111')

但是,我一直得到以下错误

ValueError: arrays must all be same length

如何将其正确导入数据帧?在

这是json的结构:

^{pr2}$

}


Tags: 文件函数httpsapijsonpandasreadproduct
3条回答

The ^{} function采用多种格式。在

由于您没有指定json文件的格式(orient=属性),pandas将默认认为您的数据是列式的。熊猫期望的不同格式将在下面讨论。在

您正试图从https://cws01.worldstores.co.uk/api/product.php?product_sku=125T:FT0111解析的数据 似乎不符合任何支持的格式,因为它似乎只是一个“记录”。熊猫期待着某种收藏。在

您可能应该尝试将多个条目收集到一个文件中,然后使用read_json函数对其进行解析。在

编辑:

获取多行并使用pandas.read_json函数进行解析的简单方法:

import urllib2
import pandas as pd


url_base = "https://cws01.worldstores.co.uk/api/product.php?product_sku={}"
products = ["125T:FT0111", "125T:FT0111", "125T:FT0111"]

raw_data_list = []

for sku in products:
    url = url_base.format(sku)
    raw_data_list.append(urllib2.urlopen(url).read())

data = "[" + (",".join(raw_data_list)) + "]"
data = pd.read_json(data, orient='records')
data

/编辑

我对pandas.read_json函数格式。

The ^{} function是pandas试图将尽可能多的功能塞进单个函数的另一个光辉例子。这当然是一个非常复杂的函数。在

系列

如果您的数据是Seriespandas.read_json(orient=)默认为'index'

解析Series时允许的定向值是:{'split','records','index'}

注意,序列索引对于orient='index'必须是唯一的。在

数据帧

如果您的数据是DataFramepandas.read_json(orient=)默认为'columns'

解析DataFrame时允许的定向值为: {'split','records','index','columns','values'}

注意,序列索引对于orient='index'orient='columns'必须是唯一的,而数据帧列对于orient='index'orient='columns'和{}必须是唯一的。在

格式

无论您的数据是DataFrame还是Series,该orient=都将期望数据的格式相同:

分裂

需要dict的字符串表示形式,如DataFrame构造函数所采用的格式:

^{pr2}$

记录

需要dict列表的字符串表示形式,如:

[{"col1":8,"col2":5},{"col1":7,"col2":6},{"col1":6,"col2":7},{"col1":5,"col2":8}]

注意这里没有设置索引。在

索引

需要嵌套dict dict的字符串表示形式,如:

{"1":{"col1":8,"col2":5},"2":{"col1":7,"col2":6},"3":{"col1":6,"col2":7},"4":{"col1":5,"col2":8}}

值得注意的是,除了字符串,它不接受其他类型的指示符。可能在以后的版本中修复。在

需要嵌套dict的字符串表示形式,如:

{"col1":{"1":8,"2":7,"3":6,"4":5},"col2":{"1":5,"2":6,"3":7,"4":8}}

价值观

需要列表的字符串表示形式,如:

[[8, 5],[7, 6],[6, 7],[5, 8]]

结果数据帧

在大多数情况下,您得到的数据帧如下所示,其中包含上面的json字符串:

   col1  col2
1     8     5
2     7     6
3     6     7
4     5     8

也许这并不是最优雅的解决方案,但却能让我找回我想要的东西,或者至少我相信是这样的,如果出了什么问题,请随时发出警告

url = "https://cws01.worldstores.co.uk/api/product.php?product_sku=125T:FT0111"
data = urllib2.urlopen(url).read()
data = json.loads(data)
data = pd.DataFrame(data.items())
data = data.transpose()

另一个解决方案是使用try-except。在

json_path='https://cws01.worldstores.co.uk/api/product.php?product_sku=125T:FT0111'
try: a=pd.read_json(json_path)
except ValueError: a=pd.read_json("["+json_path+"]")

相关问题 更多 >