【问题标题】:extracting dataframe out of json file with same key values从具有相同键值的json文件中提取数据帧
【发布时间】:2018-09-01 09:16:39
【问题描述】:

我有一个 json 文件(如下所示),我需要提取一个 dataframe,其中列名作为 "jive_label" 在 profile 中的值>[] 和 values 作为它的值,预期的输出如下。我也给出了示例代码,我尝试只打印一列,但该代码显然不起作用。

import requests
import pandas as pd
import numpy as np
from pandas.io.json import json_normalize
import sys
import json


r=requests.get(url,data=payload,headers=headers,params=querystring,verify=False)
json_data=r.json()
df=pd.DataFrame([])
    for i in json_data.get('profile',[]):
        if i.get('jive_label')=='Title':

            dfDict={'Title': i.get('value')
                   }
         df=df.append(pd.DataFrame(dfDICT,index=[0]),ignore_index=True)
    print(df.head())*


  {
        "jive": {
                "enabled": true,
                "external": false,
                "federated": true,
                "lastProfileUpdate": "2017-08-14T17:07:35.491+0000",
                "level": {
                    "description": "Level 1",
                    "imageURI": "https:",
                    "name": "Newbie",
                    "points": 0
                },
                "locale": "en_US",
                "externalContributor": false,
                "profile": [
                    {
                        "jive_label": "Title",
                        "value": "Analyst",
                        "jive_displayOrder": 0,
                        "jive_showSummaryLabel": false
                    },
                    {
                        "jive_label": "COMPANY ID",
                        "value": "333333",
                        "jive_displayOrder": 5,
                        "jive_showSummaryLabel": false
                    },
                    {
                        "jive_label": "Department",
                        "value": "46152",
                        "jive_displayOrder": 6,
                        "jive_showSummaryLabel": false
                    },
                    {
                        "jive_label": "BUFUGU",
                        "value": "C06",
                        "jive_displayOrder": 9,
                        "jive_showSummaryLabel": false
                    },
                    {
                        "jive_label": "XYZ Company Code",
                        "value": "DA01",
                        "jive_displayOrder": 10,
                        "jive_showSummaryLabel": false
                    },
                    {
                        "jive_label": "Business Purpose",
                        "value": "C0820",
                        "jive_displayOrder": 11,
                        "jive_showSummaryLabel": false
                    },
                    {
                        "jive_label": "Company",
                        "value": "XYZ",
                        "jive_displayOrder": 19,
                        "jive_showSummaryLabel": false
                    },
                    {
                        "jive_label": "Street Address",
                        "value": "30 NY NY",
                        "jive_displayOrder": 20,
                        "jive_showSummaryLabel": false
                    },
                    {
                        "jive_label": "City",
                        "value": "NYC",
                        "jive_displayOrder": 21,
                        "jive_showSummaryLabel": false
                    },
                    {
                        "jive_label": "Province/State",
                        "value": "NY",
                        "jive_displayOrder": 22,
                        "jive_showSummaryLabel": false
                    },
                    {
                        "jive_label": "Postal/Zip Code",
                        "value": "00000",
                        "jive_displayOrder": 23,
                        "jive_showSummaryLabel": false
                    },
                    {
                        "jive_label": "Country",
                        "value": "United States",
                        "jive_displayOrder": 24,
                        "jive_showSummaryLabel": false
                    },
                    {
                        "jive_label": "Preferred Language",
                        "value": "E",
                        "jive_displayOrder": 30,
                        "jive_showSummaryLabel": false
                    },
                    {
                        "jive_label": "Display Name",
                        "value": "P, M",
                        "jive_displayOrder": 31,
                        "jive_showSummaryLabel": false
                    },
                    {
                        "jive_label": "ReportsTo",
                        "value": "529847279",
                        "jive_displayOrder": 37,
                        "jive_showSummaryLabel": false
                    },
                    {
                        "jive_label": "Transit Number",
                        "value": "46152",
                        "jive_displayOrder": 38,
                        "jive_showSummaryLabel": false
                    },
                    {
                        "jive_label": "Transit Description",
                        "value": "A B C D",
                        "jive_displayOrder": 39,
                        "jive_showSummaryLabel": false
                    }
                ],
        }

预期输出:

【问题讨论】:

    标签: python json pandas dictionary dataframe


    【解决方案1】:

    使用以下代码:

    import json
    import pandas as pd
    
    with open('data.json') as fd:
        data = json.load(fd)
    
    profile = data['jive']['profile']
    headers = [e['jive_label'] for e in profile]
    values  = [e['value']      for e in profile]
    
    df = pd.DataFrame(columns=headers, data=[values])
    

    【讨论】:

    • 很高兴它有帮助。请通过单击对您最有帮助的答案左侧的复选标记来关闭问题。谢谢。
    【解决方案2】:

    使用 pandas from_dict 是解决此问题的一种方法:

    # normalize your dict and drop unwanted fields
    data = pd.DataFrame.from_dict(myjson['jive']['profile']).drop(['jive_displayOrder','jive_showSummaryLabel'], axis=1)
    
    # reshape the data
    data = pd.pivot_table(data, index=None, columns='jive_label', values='value', aggfunc='max')
    
    # remove unwanted names
    data.columns.name = None
    data.reset_index(drop=True)
    
    print(data)
    
       BUFUGU  BusinessPurpose COMPANY ID   City    Company     Country     Department  Display Name    Postal/Zip Code Preferred Language  Province/State  ReportsTo Street Address Title Transit Description  Transit Number  XYZ Company Code
    0   C06     C0820   333333  NYC     XYZ     United States   46152   P, M    00000   E   NY  529847279   30 NY NY    Analyst     A B C D     46152   DA01
    

    【讨论】:

    • 实际上我给出的 json 是 api 调用的大 json 响应的一部分。所以当我运行你的代码时,它会给出一个错误,比如 - KeyError: 'jive' 所以它应该在一个循环中可能是?我不确定
    • jive不是大json的key吗?
    • 嘿,你介意帮我解决他的问题吗stackoverflow.com/q/49515298/6067089,我好难受!
    猜你喜欢
    • 2021-09-29
    • 1970-01-01
    • 1970-01-01
    • 2019-10-20
    • 1970-01-01
    • 1970-01-01
    • 2020-05-18
    • 2018-02-23
    • 1970-01-01
    相关资源
    最近更新 更多