【问题标题】:Get nested JSON to be pandas dataframe将嵌套的 JSON 获取为 pandas 数据框
【发布时间】: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,而无需知道名称(如果我有任何意义的话)。

标签: python arrays json pandas


【解决方案1】:

在你的例子中

df = df.set_index('symbol')

然后打电话

df.loc['TSLA']

或者你可以这样做

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

【讨论】:

    猜你喜欢
    • 2017-03-21
    • 2020-12-16
    • 1970-01-01
    • 2019-11-24
    • 1970-01-01
    • 1970-01-01
    • 2020-09-27
    • 2022-01-21
    相关资源
    最近更新 更多