将嵌套的 JSON 获取为 pandas 数据框

Posted

技术标签:

【中文标题】将嵌套的 JSON 获取为 pandas 数据框【英文标题】:Get nested JSON to be pandas dataframe 【发布时间】:2021-12-09 13:29:37 【问题描述】:

我有这个 JSON,


  "status": "ok",
  "stocks": [
    
      "symbol": "TSLA",
      "price": [
        
          "date": "2021-10-19",
          "close": 141.98
        
      ]
    ,
    
      "symbol": "AMZN",
      "price": [
        
          "date": "2021-10-19",
          "close": 3444.15
        
      ]
    
  ]

我需要根据 price 从第一个数组和第二个数组创建两个 pandas 数据框,而不使用股票名称来识别它。

预期:

第一个数组(基于 TSLA),df1

    date      close
2021-10-19   141.98

第二个数组(基于 AMZN),df2

    date      close
2021-10-19   3444.15

我曾探索过 pandas 的 json_normalize 函数,但它似乎只能展平 JSON 的第一级。我怎样才能展平第二层,只得到我预期的结果?

编辑:

设法让它发挥作用,完全不是我预期的结果。使用这个,

df = pd.json_normalize(data['stocks'], record_path='price', meta=['symbol'])

返回

    date      close    symbol
2021-10-19   141.98    TSLA
2021-10-19   3444.15   AMZN

在执行json_normalize 时,有没有办法让两只股票分开,就像我的预期结果一样?

【问题讨论】:

为什么需要两个数据框?这似乎没有意义。您当然可以使用df1 = df[df'symbol']=='TSLA'df2 = df[df['symbol']=='AMZN'] 这行代码将在不知道 JSON 中的符号名称的情况下运行,因此我无法在您建议的内容中硬编码符号名称。这个想法是根据每个数组的第一个数组和第二个数组获取 df,而无需知道名称(如果我有任何意义的话)。 【参考方案1】:

在你的例子中

df = df.set_index('symbol')

然后打电话

df.loc['TSLA']

或者你可以这样做

d = x : y for x ,y in df.groupby(df.index)
d[0]
d[1]

【讨论】:

以上是关于将嵌套的 JSON 获取为 pandas 数据框的主要内容,如果未能解决你的问题,请参考以下文章

如何将嵌套的 JSON 键规范化为 pandas 数据帧

将 Pandas 数据框转换为嵌套 JSON

将多个嵌套 JSON 转换为 Pandas 数据框

如何将此嵌套的 JSON 以柱状形式转换为 Pandas 数据框

将嵌套的 Json 文件展平为 Pandas 数据框

将 Pandas Dataframe 转换为表记录的嵌套 JSON