如何使用Pandas JSON标准化此嵌套结构?

时间:2018-06-25 16:38:56

标签: json pandas

我有一个THIS网址中具有以下结构的JSON网址,并试图从下面的结构中获取名称,价格和数量

{'data': {'1': {'id': 1,
   'name': 'Bitcoin',
   'symbol': 'BTC',
   'website_slug': 'bitcoin',
   'rank': 1,
   'circulating_supply': 17115025.0,
   'total_supply': 17115025.0,
   'max_supply': 21000000.0,
   'quotes': {'USD': {'price': 6317.68,
     'volume_24h': 5034440000.0,
     'market_cap': 108127251142.0,
     'percent_change_1h': 0.22,
     'percent_change_24h': 5.26,
     'percent_change_7d': -4.37}},
   'last_updated': 1529943576},
  '2': {'id': 2,
   'name': 'Litecoin',
   'symbol': 'LTC',
   'website_slug': 'litecoin',
   'rank': 6,
   'circulating_supply': 57133246.0,
   'total_supply': 57133246.0,
   'max_supply': 84000000.0,
   'quotes': {'USD': {'price': 84.4893,
     'volume_24h': 512241000.0,
     'market_cap': 4827147957.0,
     'percent_change_1h': 1.97,
     'percent_change_24h': 8.96,
     'percent_change_7d': -12.54}},
   'last_updated': 1529943541}},
 'metadata': {'timestamp': 1529943282,
  'num_cryptocurrencies': 1586,
  'error': None}}

我尝试了几种变体来连续获得每个硬币,但到目前为止都失败了

尝试1

df = pd.read_json('https://api.coinmarketcap.com/v2/ticker')

enter image description here

尝试2

data = requests.get('https://api.coinmarketcap.com/v2/ticker',params).json()

df = pd.DataFrame(data['data'])

df

enter image description here

尝试3

我在stackoverflow上发现了一个名为json normalize的函数,我尝试使用它,但到目前为止还没有运气

df = pd.io.json.json_normalize(data['data'])
df

任何关于如何将每个硬币变成一排的建议都将受到赞赏

enter image description here

更新1

params = {'start': 0, 'sort': 'id', 'limit': 100}
data = requests.get('https://api.coinmarketcap.com/v2/ticker', params).json()
df = pd.DataFrame(data['data'])
df = df.transpose()
df.set_index('id')

这与我想要的非常接近,但是如何从报价中获取数量和价格

enter image description here

1 个答案:

答案 0 :(得分:2)

假设“报价”只有1行,键是“ USD”,我这样做了

df.drop('quotes', 1).join(
    pd.DataFrame(
        df.quotes.apply(
            lambda x: {'USD'+'_'+key: val for key, val in x['USD'].items()}
                       ).tolist()
                )
)