【问题标题】:convert JSON to python dataframe将 JSON 转换为 python 数据框
【发布时间】:2017-10-31 14:33:20
【问题描述】:

我有 JSON 格式:

{
    "abc":
      {
        "123":[45600,null,3567],
        "378":[78689,2345,5678],
        "343":[23456,null,null]
      }
    }

我使用以下方式从 url 获取 json 数据:

json_data = json.loads(url.read().decode())

我需要将其转换为 Python Pandas Dataframe,如下所示:

ds    y_ds1  y_ds2  y_ds2
123   45600  null   3567
378   78689  2345   5678
343   23456  null   null

我正在尝试这样做:

df = pd.read_json(url,orient='columns')

结果如下:

          abc
123      [45600,null,3567]
378      [78689,2345,5678]
343      [23456,null,null]

我可以简单地将第二列数组拆分为 no 的任何方式。数组中存在的列并重命名上述标题?

编辑:根据给定的json,所有数组中都有3个元素;如果所有项目的数组大小为 2 或 4 或 5 怎么办?注意:JSON 将包含具有相似大小数组的所有键。但是数组的大小可以是任何值。

【问题讨论】:

    标签: python json python-3.x pandas dataframe


    【解决方案1】:

    这对你有用吗?

    import pandas as pd
    import numpy as np
    
    null = np.nan
    
    my_json = {
        "abc":
          {
            "123":[45600,null,3567],
            "378":[78689,2345,5678],
            "343":[23456,null,null]
          }
        }
    
    pd.DataFrame(my_json.get('abc')).T.reset_index().rename(columns={'index':'ds',0:'y_ds1',1:'y_ds2',2:'y_ds3'})
    
        ds    y_ds1   y_ds2   y_ds2
    0  123  45600.0     NaN  3567.0
    1  343  23456.0     NaN     NaN
    2  378  78689.0  2345.0  5678.0
    

    如果索引列可以保留ds 列,则可以这样做:

    pd.DataFrame(my_json.get('abc')).T.rename(columns=(lambda x: 'y_ds' + str(x)))
    
           y_ds0   y_ds1   y_ds2
    123  45600.0     NaN  3567.0
    343  23456.0     NaN     NaN
    378  78689.0  2345.0  5678.0
    

    编辑:鉴于您在编辑中提供的DF,您可以将其转换为:

    temp = df['abc'].apply(lambda x: pd.Series(x)).rename(columns=(lambda x: :'y_ds'+str(x)))
    
    temp
    
           y_ds0   y_ds1   y_ds2
    123  45600.0     NaN  3567.0
    378  78689.0  2345.0  5678.0
    343  23456.0     NaN     NaN
    

    【讨论】:

    • 如果您可以提出建议,请检查编辑。
    • 我认为你的最后一个会起作用,但标题 ds 中应包含值为 123,378 等的索引列
    • 只做temp.index.name = 'ds'
    • 我的意思是索引列应该被视为带有标题 ds 的数据框的一部分。即使我做 "temp.index.name = 'ds'";不。数据框中的列数是 3 而不是 4。它应该是 4 列。
    • 好吧,在那之后做temp.reset_index(),你就准备好了。
    猜你喜欢
    • 1970-01-01
    • 2020-05-29
    • 2018-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多