【问题标题】:How to convert Nested JSON to Pandas Dataframe如何将嵌套 JSON 转换为 Pandas 数据框
【发布时间】:2020-11-12 03:47:53
【问题描述】:

我有以下嵌套的 json:

import requests

    headers = {
        'Content-Type': 'application/json'
    }
    r = requests.get("...API DATA...")
    [
        {
            "ticker":"btcusd",
            "baseCurrency":"btc",
            "quoteCurrency":"usd",
            "priceData":[
                {
                    "open":3914.749407813885,
                    "high":3942.374263716895,
                    "low":3846.1755315352952,
                    "close":3849.1217299601617,
                    "date":"2019-01-02T00:00:00+00:00",
                    "tradesDone":756.0,
                    "volume":339.68131616889997,
                    "volumeNotional":1307474.735327181
                }
            ]
        }
    ]

我想把它转换成 Pandas 数据框。我已经能够做到这一点:

j = r.json()
df = pd.DataFrame.from_dict(j)
df

输出:

我还想在列中展开“priceData”。

我尝试了不同的方法,包括json.normalise和json.loads,但总是出现我无法理解的错误。

谁能告诉我怎么做才能理解?

谢谢!

编辑

priceData 包含超过 1 个元素。

“ticker”、“baseCurrency”和“quoteCurrency”在数据帧中并不是必需的,因此可以丢弃。

【问题讨论】:

  • 能否为 priceData 添加更多详细信息?它总是列出 1 个元素吗?那个json呢?它总是列出 1 个元素吗?
  • priceData 有超过 1 个元素。 'Ticker'、'baseCurrency' 和 'quoteCurrency' 根本不需要,可能会被丢弃。谢谢@SatrioAdiPrabowo t

标签: python json pandas dataframe nested


【解决方案1】:

使用json_normalize:

import pandas as pd
pd.json_normalize(data,'priceData',['ticker','baseCurrency','quoteCurrency'])

在哪里,

data = [
    {
        "ticker":"btcusd",
        "baseCurrency":"btc",
        "quoteCurrency":"usd",
        "priceData":[
            {
                "open":3914.749407813885,
                "high":3942.374263716895,
                "low":3846.1755315352952,
                "close":3849.1217299601617,
                "date":"2019-01-02T00:00:00+00:00",
                "tradesDone":756.0,
                "volume":339.68131616889997,
                "volumeNotional":1307474.735327181
            }
        ]
    }
]

编辑:用于多个 API 调用

final_data = []
for _ in range(3): ## how ever many times you want to call the API
    ## get you data from each API call
    final_data.extend(data)

【讨论】:

  • 谢谢你成功了!我还有另一个问题:如果我想发出超过 1 个具有相同 json 格式但数据不同的 API 请求(即,只是更改日期以获取更多数据),有没有办法在执行 json_normalize 之前连接这些请求?
  • 为什么不先json_normalize,然后再pd.concat
  • 是的,我能做到,谢谢,但我认为这将是非常机械的,因为我必须进行许多 API 调用,然后 json.normalise 所有这些调用,然后 pd.concat。我想知道是否可以在一个请求中进行所有 API 调用,然后只调用一次 json.normalise。
  • 好吧,既然 data 是一个list,你也可以使用list.extend - 所以,一个final_list = [],然后你动不动就做一个final_list.extend(data)
猜你喜欢
  • 2017-03-21
  • 2020-12-16
  • 1970-01-01
  • 2020-01-03
  • 2021-01-02
  • 2019-11-24
  • 1970-01-01
  • 2022-01-21
相关资源
最近更新 更多