我正在尝试使用函数导入一个 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的结构:
{
"id": "5",
"sku": "JOSH:BECO-BRN",
"last_updated": "2013-06-10 15:46:22",
...
"propertyType1": [
"manufacturer_colour"
],
"category": [
{
"category_id": "10",
"category_name": "All Products"
},
...
{
"category_id": "238",
"category_name": "All Sofas"
}
],
"root_categories": [
"516"
],
"url": "/p/Beco Suede Sofa Bed?product_id=5",
"item": [
"2"
],
"image_names": "[\"https:\\/\\/cdn.worldstores.co.uk\\/images\\/products\\/L\\/19\\/Beco_Suede_Sofa_Bed-1.jpg\",\"https:\\/\\/cdn.worldstores.co.uk\\/images\\/products\\/P\\/19\\/Beco_Suede_Sofa_Bed-1.jpg\",\"https:\\/\\/cdn.worldstores.co.uk\\/images\\/products\\/SP\\/19\\/Beco_Suede_Sofa_Bed-1.jpg\",\"https:\\/\\/cdn.worldstores.co.uk\\/images\\/products\\/SS\\/19\\/Beco_Suede_Sofa_Bed-1.jpg\",\"https:\\/\\/cdn.worldstores.co.uk\\/images\\/products\\/ST\\/19\\/Beco_Suede_Sofa_Bed-1.jpg\",\"https:\\/\\/cdn.worldstores.co.uk\\/images\\/products\\/WP\\/19\\/Beco_Suede_Sofa_Bed-1.jpg\",\"https:\\/\\/cdn.worldstores.co.uk\\/images\\/products\\/L\\/19\\/Beco_Suede_Sofa_Bed-2.jpg\",\"https:\\/\\/cdn.worldstores.co.uk\\/images\\/products\\/P\\/19\\/Beco_Suede_Sofa_Bed-2.jpg\",\"https:\\/\\/cdn.worldstores.co.uk\\/images\\/products\\/SP\\/19\\/Beco_Suede_Sofa_Bed-2.jpg\",\"https:\\/\\/cdn.worldstores.co.uk \\/images\\/products\\/SS\\/19\\/Beco_Suede_Sofa_Bed-2.jpg\",\"https:\\/\\/cdn.worldstores.co.uk\\/images\\/products\\/ST\\/19\\/Beco_Suede_Sofa_Bed-2.jpg\",\"https:\\/\\/cdn.worldstores.co.uk\\/images\\/products\\/WP\\/19\\/Beco_Suede_Sofa_Bed-2.jpg\"]"
最佳答案
The pandas.read_json
function采用多种格式。
由于您没有指定您的 json 文件的格式(orient=
属性),pandas 将默认认为您的数据是柱状的。 pandas 期望的不同格式在下面讨论。
您试图从 https://cws01.worldstores.co.uk/api/product.php?product_sku=125T:FT0111 解析的数据 似乎不符合任何支持的格式,因为它似乎只是一个“记录”。 Pandas 需要某种集合。
您可能应该尝试将多个条目收集到一个文件中,然后使用 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 pandas.read_json
function是 pandas 试图将尽可能多的功能集成到一个函数中的又一个光辉例子。这当然会导致非常非常复杂的功能。
系列
如果您的数据是系列
,pandas.read_json(orient=)
默认为'index'
解析 Series
时 orient 允许的值是:{'split','records','index'}
请注意,orient='index'
的 Series 索引必须是唯一的。
数据框
如果您的数据是 DataFrame
,pandas.read_json(orient=)
默认为 'columns'
解析 DataFrame
时 orient 允许的值是:
{'split','records','index','columns','values'}
注意Series索引对于orient='index'
和orient='columns'
必须是唯一的,DataFrame的列对于orient必须是唯一的='index'
、orient='columns'
和 orient='records'
。
格式
无论您的数据是 DataFrame
还是 Series
,orient=
都需要相同格式的数据:
split
期望像 DataFrame
构造函数采用的那样的 dict 的字符串表示:
{"index":[1,2,3,4], "columns":["col1","col2"], "data":[[8,7,6,5], [5,6,7,8]]}
记录
期望字典列表的字符串表示形式,例如:
[{"col1":8,"col2":5},{"col1":7,"col2":6},{"col1":6,"col2":7},{"col1":5,"col2":8}]
注意这里没有设置索引。
索引
期望嵌套字典的字符串表示形式如下:
{"1":{"col1":8,"col2":5},"2":{"col1":7,"col2":6},"3":{"col1":6,"col2":7},"4":{"col1":5,"col2":8}}
值得注意的是,它不接受字符串以外的其他类型的索引。可能会在以后的版本中修复。
列
期望嵌套字典的字符串表示形式如下:
{"col1":{"1":8,"2":7,"3":6,"4":5},"col2":{"1":5,"2":6,"3":7,"4":8}}
值(value)观
期望列表的字符串表示形式如下:
[[8, 5],[7, 6],[6, 7],[5, 8]]
结果数据框
在大多数情况下,您获得的数据框将如下所示,带有上面的 json 字符串:
col1 col2
1 8 5
2 7 6
3 6 7
4 5 8
关于python - 在 Pandas 中使用 read_json 导入单条记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31656040/