【问题标题】:How to get a pandas df from a json API response如何从 json API 响应中获取 pandas df
【发布时间】:2021-08-19 23:33:06
【问题描述】:

所以我有来自 API 调用的 JSON 响应

{ "search": { "entry": [
{ "dn": "cn=SlackIntegration-test1,ou=metadata,ou=ibmgroups,o=ibm.com",
"attribute": [
{ "name": "admin", "value": [ "uid=052355781,c=mx,ou=bluepages,o=ibm.com" ] },
{ "name": "owner", "value": [ "uid=052355781,c=mx,ou=bluepages,o=ibm.com" ] }]
},
{ "dn": "cn=SlackIntegration-test2,ou=metadata,ou=ibmgroups,o=ibm.com",
"attribute": [
{ "name": "admin", "value": [ "uid=001753781,c=mx,ou=bluepages,o=ibm.com" ] },
{ "name": "owner", "value": [ "uid=052355781,c=mx,ou=bluepages,o=ibm.com" ] }]
},
{ "dn": "cn=SlackIntegration-pidtest,ou=metadata,ou=ibmgroups,o=ibm.com",
"attribute": [
{ "name": "admin", "value": [ "uid=000326781,c=mx,ou=bluepages,o=ibm.com" ] },
{ "name": "owner", "value": [ "uid=052355781,c=mx,ou=bluepages,o=ibm.com" ] }]
},
{ "dn": "cn=SlackIntegration-APItest,ou=metadata,ou=ibmgroups,o=ibm.com",
"attribute": [
{ "name": "owner", "value": [ "uid=052355781,c=mx,ou=bluepages,o=ibm.com" ] }]
}
],
"return": {
"code": 0,
"message": "Success",
"count": 4
}
} } 

我期待有这样的 df

index cn admin owner
0 SlackIntegration-test1 052355781 052355781
1 SlackIntegration-test2 001753781 052355781
2 SlackIntegration-pidtest 000326781 052355781
3 SlackIntegration-APItest 052355781

我无法规范化 json 或者如何在 json 中迭代以获得类似的东西,到目前为止我有这个代码,但它只返回这个。

def get_channel_info():

    LOGGER.info("Getting channel name")
    url = 'http://bluepages.ibm.com/BpHttpApisv3/slaphapi?ou=metadata,ou=ibmgroups,o=ibm.com/\
          (cn=slack*).list,base/byjson?*cn&owner&admin'
    # request to API
    try:
        res = requests.get(url)
    except requests.exceptions.HTTPError:
        if requests.get.status_code == 429:
            LOGGER.warning("Request limit reached. Waiting 4 minutes and attempting request again.")
            time.sleep(240)
            res = requests.get(url)
        else:
            LOGGER.error('Request error occurred. HTTP Status:{:0}'.format(requests.get.status_code))
            raise
    if res.status_code == 200:
        json_res = res.json()
        json_res = json_res['search']['entry']
        for row in json_res:
            data = json_res[int(json_res.index(row))]['attribute']
            df_band = pd.DataFrame(data)

    return df_band

【问题讨论】:

    标签: python json pandas dataframe


    【解决方案1】:

    如果d 包含问题中的字典,则可以使用以下示例:

    data = []
    for e in d["search"]["entry"]:
        data.append(
            {
                "cn": e["dn"].split(",")[0].split("=")[-1],
                **{
                    a["name"]: a["value"][0].split(",")[0].split("=")[-1]
                    for a in e["attribute"]
                },
            }
        )
    
    df = pd.DataFrame(data).fillna("")
    print(df)
    

    打印:

                             cn      admin      owner
    0    SlackIntegration-test1  052355781  052355781
    1    SlackIntegration-test2  001753781  052355781
    2  SlackIntegration-pidtest  000326781  052355781
    3  SlackIntegration-APItest             052355781
    

    【讨论】:

    • 是的,正是我想要的,谢谢!!
    猜你喜欢
    • 1970-01-01
    • 2019-04-25
    • 1970-01-01
    • 2018-05-31
    • 1970-01-01
    • 2021-07-26
    • 2016-08-28
    • 2019-12-29
    • 1970-01-01
    相关资源
    最近更新 更多