如何将加密货币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_pair | amount | create_time | price | side |
|---|---|---|---|---|
| UOS_USDT | 1282.84 | 1655394430 | 0.1949 | buy |
| RMRK_USDT | 79.365 | 1655394431 | 2.52 | buy |
错误原因说明
pd.DataFrame(data):直接转换会将orders列保留为列表对象,无法展开嵌套字段data["orders"]:data是列表类型,不能用字符串作为索引,因此触发TypeErrordata["currency_pair"]["orders"]:同样犯了列表用字符串索引的错误,逻辑不成立
内容的提问来源于stack exchange,提问作者user1903663
相关产品推荐
相关产品推荐

