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

从含字典列表的Pandas DataFrame提取数据并生成新DataFrame

Pandas字典列表列的聚合计算方案

需求说明

现有一个包含bestBids和bestAsks两列的Pandas DataFrame(近500行),每列元素是包含5个字典的列表,每个字典包含number、quantity(字符串型数值)、price(字符串型数值)键值对。需要生成新DataFrame,对每行的bestBids计算quantity总和、price平均值,对bestAsks执行同样计算。

解决方案代码

1. 构造示例DataFrame(模拟原始数据)

import pandas as pd

# 原始数据结构示例
data = {'bestBids': {20: [{'number': '1', 'quantity': '17875', 'price': '4.40'}, {'number': '2', 'quantity': '6300', 'price': '4.35'}, {'number': '3', 'quantity': '4925', 'price': '4.30'}, {'number': '4', 'quantity': '6700', 'price': '4.25'}, {'number': '5', 'quantity': '9175', 'price': '4.20'}], 22: [{'number': '1', 'quantity': '1925', 'price': '5.70'}, {'number': '2', 'quantity': '25', 'price': '5.55'}, {'number': '3', 'quantity': '1200', 'price': '5.50'}, {'number': '4', 'quantity': '800', 'price': '5.45'}, {'number': '5', 'quantity': '800', 'price': '5.40'}], 24: [{'number': '1', 'quantity': '325', 'price': '6.45'}, {'number': '2', 'quantity': '725', 'price': '6.40'}, {'number': '3', 'quantity': '25', 'price': '6.30'}, {'number': '4', 'quantity': '800', 'price': '6.20'}, {'number': '5', 'quantity': '25', 'price': '6.15'}], 34: [{'number': '1', 'quantity': '1550', 'price': '7.00'}, {'number': '2', 'quantity': '75', 'price': '6.85'}, {'number': '3', 'quantity': '900', 'price': '6.80'}, {'number': '4', 'quantity': '1350', 'price': '6.65'}, {'number': '5', 'quantity': '500', 'price': '6.55'}], 44: [{'number': '1', 'quantity': '50', 'price': '7.25'}, {'number': '2', 'quantity': '800', 'price': '7.20'}, {'number': '3', 'quantity': '250', 'price': '7.15'}, {'number': '4', 'quantity': '1800', 'price': '7.10'}, {'number': '5', 'quantity': '575', 'price': '7.05'}]}, 'bestAsks': {20: [{'number': '1', 'quantity': '900', 'price': '4.50'}, {'number': '2', 'quantity': '1700', 'price': '4.55'}, {'number': '3', 'quantity': '250', 'price': '4.60'}, {'number': '4', 'quantity': '2425', 'price': '4.70'}, {'number': '5', 'quantity': '4425', 'price': '4.75'}], 22: [{'number': '1', 'quantity': '3900', 'price': '5.80'}, {'number': '2', 'quantity': '400', 'price': '5.85'}, {'number': '3', 'quantity': '1025', 'price': '5.90'}, {'number': '4', 'quantity': '3000', 'price': '5.95'}, {'number': '5', 'quantity': '8300', 'price': '6.00'}], 24: [{'number': '1', 'quantity': '625', 'price': '6.60'}, {'number': '2', 'quantity': '1150', 'price': '6.70'}, {'number': '3', 'quantity': '800', 'price': '7.00'}, {'number': '4', 'quantity': '1400', 'price': '7.90'}, {'number': '5', 'quantity': '50', 'price': '8.00'}], 34: [{'number': '1', 'quantity': '1500', 'price': '7.40'}, {'number': '2', 'quantity': '1750', 'price': '7.45'}, {'number': '3', 'quantity': '50', 'price': '7.50'}, {'number': '4', 'quantity': '1000', 'price': '7.60'}, {'number': '5', 'quantity': '25', 'price': '7.70'}], 44: [{'number': '1', 'quantity': '125', 'price': '7.85'}, {'number': '2', 'quantity': '400', 'price': '9.00'}, {'number': '3', 'quantity': '400', 'price': '9.80'}, {'number': '4', 'quantity': '2000', 'price': '10.95'}, {'number': '5', 'quantity': '75', 'price': '11.00'}]}}

# 转换为DataFrame
df = pd.DataFrame.from_dict(data, orient='index').T

2. 定义聚合函数

def aggregate_book(book_list):
    # 将字符串转为数值类型
    quantities = [int(item['quantity']) for item in book_list]
    prices = [float(item['price']) for item in book_list]
    # 计算总和与平均值
    total_qty = sum(quantities)
    avg_price = sum(prices) / len(prices)
    return pd.Series([total_qty, avg_price], index=['total_quantity', 'avg_price'])

3. 执行聚合并生成新DataFrame

# 对买卖盘分别执行聚合计算
bids_result = df['bestBids'].apply(aggregate_book).add_prefix('bids_')
asks_result = df['bestAsks'].apply(aggregate_book).add_prefix('asks_')

# 合并结果
new_df = pd.concat([bids_result, asks_result], axis=1)

4. 查看结果

print(new_df)

输出示例:

bids_total_quantity  bids_avg_price  asks_total_quantity  asks_avg_price
20                44975           4.300                9700           4.620
22                 4750           5.520               16625           5.900
24                 1900           6.300                4025           7.240
34                 4375           6.770                4325           7.530
44                 3475           7.150                3000           9.720

关键说明

  • 聚合函数aggregate_book负责处理单一行的字典列表,完成类型转换和统计计算,返回Series保证结果能直接拼接成DataFrame。
  • apply方法逐行处理列中每个字典列表,add_prefix为列名添加前缀,避免买卖盘统计字段重名。
  • concat将买卖盘的统计结果合并,最终得到包含4个统计字段的新DataFrame,完全匹配需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 18:52:37