将复杂的嵌套JSON解析为Pandas Dataframe

时间:2019-04-01 00:01:31

标签: json python-3.x pandas

我正在尝试从我从API接收到的复杂且非常嵌套的JSON响应中创建一个数据框。如果有用的话,请参见API的文档:https://www.bookthatapp.com/docs/api/v1/index.html

我可以使用pandas json_normalize来获取需要加载的大部分列,但是在一定程度上超出了结构的一致性,我认为这是造成我问题的原因。

具体来说,在“容量”内,有两种潜在类型。如果类型是'variant_option',那么在容量范围内还将有'options'和'capacity'键,其中有'values'和'capacity'键。

例如:

'capacity': {'type': 'variant_option',
    'options': ['Size'],
    'capacities': [{'values': ['S/M'], 'capacity': 2},
     {'values': ['M/L'], 'capacity': 4}]}

但是,如果产品类型为“ product”,则将存在另一个称为“ capacity”的键,该键直接控制容量。

例如:

'capacity': {'type': 'product', 'capacity': 8}

我目前正在Jupyter笔记本中运行它。

url = 'https://api.bookthatapp.com/v1/products'

headers = {
    'Authorization': 'Bearer ' + key
          }
r = requests.get(url, headers= headers)
r2 = r.json()
df = json_normalize(r2['products'], 
                    record_path=['capacity'],
                    meta = ['title','id','external_id',['capacity','type']]
                    )
df

当前结果:

0 | title | id | external_id | capacity.type 
type | helmet rental | 38425 | 3668508801 | variant_option
options | helmet rental | 38425 | 3668508801 | variant_option
capacities | helmet rental | 38425 | 3668508801 | variant_option
type | showshoe rental | 38426 | 3668840705 | product
capacity | showshoe rental | 38426 | 3668840705 | product

所需结果:

title | id | external_id | variant | capacity 
helmet rental | 38425 | 3668508801 | s/m | 1
helmet rental | 38425 | 3668508801 | m/l | 2
snowshoe tail rental | 38426 | 3668840705 | null | 4

0 个答案:

没有答案