【问题标题】:Converting Flattened JSON to Dataframe in Python 2.7在 Python 2.7 中将扁平化 JSON 转换为数据框
【发布时间】:2017-12-16 01:05:50
【问题描述】:

我正在尝试使用 REST API 读取一些数据并将其写入数据库表。我写了下面的代码。但不幸的是,我有点坚持使用扁平化的 JSON。您能否提供一种将 JSON 转换为数据框的方法。

代码

 import requests
 import json
 import pandas
 from pandas.io.json import json_normalize
 from flatten_json import flatten

 j_username = 'ABCD'
 j_password = '12456'
 query = '"id = 112233445566"'
 print query
 r=requests.get('Url' % query, auth= (j_username,j_password))

 print r.json()
 first_response = r.json()
 string_data = json.dumps(r.json())
 normalized_r = json_normalize(r.json())
 print flatten(r.json())
 r_flattened = flatten(r.json())
 r_flattened_str = json.dumps(flatten(r.json()))
 print type (flatten(r.json()))

扁平化的 JSON 输出如下

      {
     'data_0_user-35': u'Xyz',
'data_0_user-34': None,
'data_0_user-37': u'CC',
'data_0_user-36': None,
'data_0_user-31': u'Regular',
'data_0_user-33': None, 
'data_0_user-32': None, 
'data_0_target-rcyc_id': 0101,
'data_0_to-mail': None,
'data_0_closing-version': None, 
'data_0_user-44': None, 
'data_0_test-reference': None,
'data_0_request-server': None, 
'data_0_target-rcyc_type': u'regular type',
'data_0_project': None,
'data_0_user-01': u'Application Name',
'data_0_user-02': None,
'data_0_user-03': None, .......
 .......

…… .....}

预期输出是

               data_0_user-35   data_0_user-34  data_0_user-37  .........

                 XYZ               None            CC             ........

【问题讨论】:

  • 这不再是 JSON —— 看起来就像一本字典。您可能可以在中间剪掉一些步骤,但根据您所拥有的,您是否尝试过致电pandas.from_dict(r_flattened)
  • 我现在已经尝试过了,得到以下错误消息'code' print pandas.from_dict(r_flattened) AttributeError: 'module' object has no attribute 'from_dict' 'code'
  • 抱歉,应该是pandas.DataFrame.from_dict()
  • 这给了我以下错误'ValueError: If using all scalar values, you must pass an index'所以我尝试了这个'print pandas.DataFrame(r_flattened.items())'给了我下面的输出
  • ` 0 1 data_0_user-35 Xyz 1 data_0_user-34 无 2 data_0_user-37 CC 3 data_0_user-36 无 4 data_0_user-31 常规 5 data_0_user-33 无 6 data_0_user-32 无 7 data_0_target-rcyc_id 0101 `

标签: python json python-2.7 dataframe flatten


【解决方案1】:

我终于破解了这个。此代码将从 REST API 读取数据并将其转换为数据帧并最终写入 Oracle 数据库。感谢我的朋友和社区中一些很棒的人,他们的回答帮助我做到了这一点。

        import requests
        from pandas.io.json import json_normalize
        import datetime as dt
        import pandas as pd
        import cx_Oracle

        date = dt.datetime.today().strftime("%Y-%m-%d")
        date = "'%s'" % date
        query2 = '"creation-time=%s"' % date
        r = requests.get('url?query=%s' % query2,
             auth=('!username', 'password#'))
        response_data_json = r.json()
        response_data_normalize = json_normalize(response_data_json['data'])
        subset = response_data_normalize.loc[:, ('value1', 'value2')]
        Counter = subset['value1'].max()
        converted_value = getattr(Counter, "tolist", lambda x=Counter: x)()
        frame = pd.DataFrame()
        for i in range(2175, converted_value + 1): #2175 is just a reference number to start the comparison from....specific to my work
            id = '"id = %s"' % i
            r = requests.get('url?&query=%s' % id, auth=('!username', 'password#'))
            response_data_json1 = r.json()
            response_data_normalize1 = json_normalize(response_data_json1['data'])
            sub = response_data_normalize1.loc[:, ('value1', 'value2', 'value3',  'value4')]
            frame = frame.append(sub, ignore_index=True)


        con = cx_Oracle.connect('USERNAME','PASSWORD',cx_Oracle.makedsn('HOSTNAME',PORTNUMBER,'SERVICENAME'))

        cur = con.cursor()
        rows = [tuple(x) for x in frame.values]
        print rows
        cur.executemany('''INSERT INTO TABLENAME(Value1, Value2,Value3,Value4) VALUES (:1,:2,:3,:4)''',rows)
        con.commit()
        cur.close()
        con.close()

【讨论】:

    猜你喜欢
    • 2021-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-09-23
    • 2021-05-24
    • 2022-01-12
    • 2019-06-22
    • 2013-11-09
    相关资源
    最近更新 更多