从含字典列表的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
相关产品推荐
相关产品推荐

