You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将加密货币API返回的嵌套JSON转为指定列的Pandas DataFrame?

问题描述

我有如下加密货币交易所API返回的JSON数据(已转为合法JSON):

[{'currency_pair': 'UOS_USDT',
  'orders': [{'account': 'spot',
              'amount': '1282.84',
              'create_time': '1655394430',
              'create_time_ms': 1655394430129,
              'currency_pair': 'UOS_USDT',
              'fee': '0',
              'fee_currency': 'UOS',
              'fill_price': '0',
              'filled_total': '0',
              'gt_discount': False,
              'gt_fee': '0',
              'iceberg': '0',
              'id': '169208865523',
              'left': '1282.84',
              'point_fee': '0',
              'price': '0.1949',
              'rebated_fee': '0',
              'rebated_fee_currency': 'USDT',
              'side': 'buy',
              'status': 'open',
              'text': 'apiv4',
              'time_in_force': 'gtc',
              'type': 'limit',
              'update_time': '1655394430',
              'update_time_ms': 1655394430129}],
  'total': 1},
 {'currency_pair': 'RMRK_USDT',
  'orders': [{'account': 'spot',
              'amount': '79.365',
              'create_time': '1655394431',
              'create_time_ms': 1655394431249,
              'currency_pair': 'RMRK_USDT',
              'fee': '0',
              'fee_currency': 'RMRK',
              'fill_price': '0',
              'filled_total': '0',
              'gt_discount': False,
              'gt_fee': '0',
              'iceberg': '0',
              'id': '169208877018',
              'left': '79.365',
              'point_fee': '0',
              'price': '2.52',
              'rebated_fee': '0',
              'rebated_fee_currency': 'USDT',
              'side': 'buy',
              'status': 'open',
              'text': 'apiv4',
              'time_in_force': 'gtc',
              'type': 'limit',
              'update_time': '1655394431',
              'update_time_ms': 1655394431249}],
  'total': 1}]

尝试过以下转换方式:

df = pd.DataFrame(data)
df = pd.DataFrame(data["orders"])
df = pd.DataFrame(data["currency_pair"]["orders"])

要么出现TypeError: list indices must be integers or slices, not str错误,要么生成的DataFrame中orders对象未被展开。需要生成包含["currency_pair", "amount", "create_time", "price", "side"]列的DataFrame。

解决方案

方法1:使用json_normalize快速展开嵌套数据

Pandas的json_normalize工具可以直接处理嵌套JSON结构,自动展开orders列表并关联外层的currency_pair字段:

import pandas as pd

# 假设data是已转换完成的JSON列表
df = pd.json_normalize(data, record_path='orders', meta='currency_pair')
# 筛选目标列
df = df[['currency_pair', 'amount', 'create_time', 'price', 'side']]

方法2:手动遍历构造数据列表

如果不想依赖json_normalize,可以手动遍历每个条目提取所需字段:

import pandas as pd

result_list = []
for item in data:
    pair = item['currency_pair']
    for order in item['orders']:
        result_list.append({
            'currency_pair': pair,
            'amount': order['amount'],
            'create_time': order['create_time'],
            'price': order['price'],
            'side': order['side']
        })
df = pd.DataFrame(result_list)

最终结果示例

两种方法都会生成如下结构的DataFrame:

currency_pairamountcreate_timepriceside
UOS_USDT1282.8416553944300.1949buy
RMRK_USDT79.36516553944312.52buy

错误原因说明

  • pd.DataFrame(data):直接转换会将orders列保留为列表对象,无法展开嵌套字段
  • data["orders"]:data是列表类型,不能用字符串作为索引,因此触发TypeError
  • data["currency_pair"]["orders"]:同样犯了列表用字符串索引的错误,逻辑不成立

内容的提问来源于stack exchange,提问作者user1903663

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 02:06:22