如何从转换响应请求.get到数据帧?

2024-06-15 20:48:30 发布

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

我有以下代码:

def flatten_json(y):
    out = {}
    def flatten(x, name=''):
        if type(x) is dict:
            for a in x:
                flatten(x[a], name + a + '_')
        elif type(x) is list:
            out[name[:-1]] = x
        else:
            out[name[:-1]] = x
    flatten(y)
    return out 

def importdata(data):
    responsedata = requests.get(urlApi, data=data, headers=hed, verify=False)
    return responsedata


def generatejson(response):
    # Generate flat json file
    sample_object = pd.DataFrame(response.json())['results'].to_dict()
    flat = {k: flat_json(v) for k, v in sample_object.items()}
    return json.dumps(flat, sort_keys=True)

response = importdata(data)
flat_json = generatejson(response)

importdata(data)返回的示例: https://textuploader.com/dz30p

这段代码将get请求发送到API get结果解析它们并生成一个JSON文件。在

这个很好用。在

现在,我想修改importdata函数以支持分页(合并在一起的多个调用)。在

所以我写了这个代码:

^{pr2}$

此代码使用分页。它连接到API,逐页获取结果并将它们组合成一个列表。如果我这样做:

print json.dumps(datarALL) 我看到了组合的JSON,所以这很好用。 转储示例: https://jsonblob.com/707ead1c-9891-11e8-b651-496f6b276e89

return datarALL的示例:

https://textuploader.com/dz39d

我的问题:

我似乎无法使用impordatatnew()的返回值来处理generatejson()。如何使impordatatnew()的返回值与兼容 generatejson()?我试图修改如下:

def generatejsonnew(response):
    #Generate flat json file
    sample_object = pd.DataFrame(response.json()).to_dict()
    flat = {k: flat_json(v) for k, v in sample_object.items()}
    return json.dumps(flat, sort_keys=True)

它提供:

sample_object = pd.DataFrame(response.json()).to_dict() AttributeError: 'list' object has no attribute 'json' I understand that but I don't know how to solve this. I can't seems to make this conversion works.


Tags: tosample代码namejsondatareturnobject
1条回答
网友
1楼 · 发布于 2024-06-15 20:48:30

它不起作用是因为你这样做:

responsedata = responsedata.text   
jsondata = json.loads(responsedata)
datarALL = datarALL + jsondata["results"]

你现在做的似乎是逐步建立一个列表。您可以将其简化为:

^{pr2}$

问题出现在后面:

pd.DataFrame(response.json())

这是因为您再次调用了json(),它已经从JSON解析为Python列表。因此出现错误消息。在

但真正令人头疼的是你为什么要这样做:

sample_object = pd.DataFrame(response.json()).to_dict()

这并不是真正的“使用Pandas”,而是将一个列表重新格式化为dict。当然有一种更直接的方法可以做到这一点,比如使用for循环来构建dict(确切地说,没有示例数据,我们无法判断)。在

无论如何,如果您想填充一个数据帧,只需删除.json()部分,它的工作方式应该与原始的非分页代码类似。在

但是更有效的方法是使用原始代码在每页上构造一个数据帧,然后调用pd.concat(pages),其中{}就是这些数据帧的列表。那么就不需要构建dataALL。在

最终,您的代码可以简化得多,最终会变成这样:

pd.concat(pd.read_json(url, ...) for url in all_page_urls)

也就是说,首先使用for循环来构建all_page_urls,然后使用上面的一个行程序将所有数据收集到单个数据帧中。在

参考号:https://pandas.pydata.org/pandas-docs/stable/generated/pandas.read_json.html#pandas.read_json

相关问题 更多 >