python - 在 Pandas 中使用 read_json 导入单条记录

标签 python json pandas

我正在尝试使用函数导入一个 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 索引必须是唯一的。

数据框

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

解析 DataFrame 时 orient 允许的值是: {'split','records','index','columns','values'}

注意Series索引对于orient='index'orient='columns'必须是唯一的,DataFrame的列对于orient必须是唯一的='index'orient='columns'orient='records'

格式

无论您的数据是 DataFrame 还是 Seriesorient= 都需要相同格式的数据:

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/

相关文章:

python - 将输入分配给列表时出现问题

python - 如何使用 H5py 在 python 3 中正确打开、读取和保存单个文件

javascript - 如何附加到一个空的 JSON 对象?

mysql 查询的 perl json 输出

python - 使用 Pandas value_counts 和 matplotlib

python - 通过将列表插入列表来扩展列表

python - Pandas 创建新的数据框,从多个观察中选择最大值

php - 如何访问 Twig 模板中的 JSON 数据?

python - Pandas 拆分列并创建元组列

python - 对行进行分组并定义列聚合规则