python-3.x 动态展平来自API的JSON响应,生成一个巨大的行

ddrv8njm  于 2022-11-19  发布在  Python
关注(0)|答案(1)|浏览(165)

我正在尝试动态扁平化一个API请求的json响应,但是只得到一行,所有的记录都返回了。请帮助我或者给我指出正确的方向。
我的json响应如下所示
导入请求,json URL ='https://data.calgary.ca/resource/848s-4m4z.json'数据= json.加载(请求.获取(URL).文本)数据

[{'sector': 'NORTH',
  'community_name': 'THORNCLIFFE',
  'group_category': 'Crime',
  'category': 'Theft FROM Vehicle',
  'count': '9',
  'resident_count': '8474',
  'date': '2018-03-01T12:00:00.000',
  'year': '2018',
  'month': 'MAR',
  'id': '2018-MAR-THORNCLIFFE-Theft FROM Vehicle-9',
  'geocoded_column': {'latitude': '51.103099554741',
   'longitude': '-114.068779421169',
   'human_address': '{"address": "", "city": "", "state": "", "zip": ""}'},
  ':@computed_region_4a3i_ccfj': '2',
  ':@computed_region_p8tp_5dkv': '4',
  ':@computed_region_4b54_tmc4': '2',
  ':@computed_region_kxmf_bzkv': '192'},
 {'sector': 'SOUTH',
  'community_name': 'WOODBINE',
  'group_category': 'Crime',
  'category': 'Theft FROM Vehicle',
  'count': '3',
  'resident_count': '8866',
  'date': '2019-11-01T00:00:00.000',
  'year': '2019',
  'month': 'NOV',
  'id': '2019-NOV-WOODBINE-Theft FROM Vehicle-3',
  'geocoded_column': {'latitude': '50.939610852207664',
   'longitude': '-114.12962865374453',
   'human_address': '{"address": "", "city": "", "state": "", "zip": ""}'},
  ':@computed_region_4a3i_ccfj': '1',
  ':@computed_region_p8tp_5dkv': '6',
  ':@computed_region_4b54_tmc4': '5',
  ':@computed_region_kxmf_bzkv': '43'}
]

Here is my code

``
`# Function for flattening
# json
 
 
def flatten_json(y):
    out = {}
 
    def flatten(x, name=''):
 
        # If the Nested key-value
        # pair is of dict type
        if type(x) is dict:
 
            for a in x:
                flatten(x[a], name + a + '_')
 
        # If the Nested key-value
        # pair is of list type
        elif type(x) is list:
 
            i = 0
 
            for a in x:
                flatten(a, name + str(i) + '_')
                i += 1
        else:
            out[name[:-1]] = x
 
    flatten(y)
    return out
 
 
# Driver code
# print(flatten_json(data))
newf=flatten_json(data)

pd.json_normalize(newf)`
``

It returns 

[enter image description here](https://i.stack.imgur.com/i6mUe.png)

While am expecting the data in the following format

[enter image description here](https://i.stack.imgur.com/mXNtU.png).

json_normalize以预期的格式提供了数据,但是我需要一种方法来动态解析不同的json请求格式(以编程方式)。

os8fio9y

os8fio9y1#

要获得正确形式的 Dataframe ,可以使用以下示例(data是问题中的列表):

import requests
import pandas as pd
from ast import literal_eval

url = "https://data.calgary.ca/resource/848s-4m4z.json"

df = pd.DataFrame(requests.get(url).json())
df = pd.concat(
    [
        df,
        df.pop("geocoded_column")
        .apply(pd.Series)
        .add_prefix("geocoded_column_"),
    ],
    axis=1,
)

df["geocoded_column_human_address"] = df["geocoded_column_human_address"].apply(
    literal_eval
)

df = pd.concat(
    [
        df,
        df.pop("geocoded_column_human_address")
        .apply(pd.Series)
        .add_prefix("addr_"),
    ],
    axis=1,
)

print(df.head().to_markdown(index=False))

印刷品:
| 扇形|团体名称|组类别|范畴|计数器|常驻计数|日期|年份|月份|标识符|:@computed_region_4a3i_ccfj|:@computed_region_p8tp_5dkv(已计算区域)|:@computed_region_4b54_tmc4的计算区域|:@计算区域kxmf bzkv|地理编码列纬度|地理编码列经度|地址地址|地址_城市|地址状态|地址_zip|
| - -|- -|- -|- -|- -|- -|- -|- -|- -|- -|- -|- -|- -|- -|- -|- -|- -|- -|- -|- -|
| 北部|索恩克利夫|犯罪|从车辆上盗窃|九个|小行星8474| 2018年3月1日12时00分00秒|二〇一八年|三月|2018年-MAR-THORNCLIFFE-车辆盗窃案-9| 2个|四个|2个|一百九十二|五十一、一零三一| -114.069 |||||
| 南部|木质|犯罪|从车辆上盗窃|三个|小行星8866| 2019年11月1日星期一00:00:00.000|二〇一九年|十一月|2019年11月-WOODBINE-车辆盗窃-3|一个|六个|五个|四十三|五十九三九六| -114.13 |||||
| 南部|柳园|犯罪|从车辆上盗窃|四个|小行星5328| 2019年11月1日星期一00:00:00.000|二〇一九年|十一月|2019年11月-柳树公园-车辆盗窃-4|三个|五个|六个|八十九|50.9566美元| -114.056 |||||
| 南部|柳园|犯罪|商业抢劫罪|一个|小行星5328| 2019年11月1日星期一00:00:00.000|二〇一九年|十一月|2019年11月-柳园-商业抢劫案-1|三个|五个|六个|八十九|50.9566美元| -114.056 |||||
| 西部|林肯公园|犯罪|广告插播|五个|小行星2617| 2019年11月1日星期一00:00:00.000|二〇一九年|十一月|2019年11月-林肯公园-商业休息和进入-5|一个|2个|八个|四十二|小行星51.0101| -114.13 |||||

相关问题