如何对Pandas订单簿DataFrame按价格分组并去重合并交易所名称?
问题
现有如下Pandas DataFrame格式的订单簿数据:
asks_price asks_qty exchange_name_ask bids_price bids_qty exchange_name_bid 0 20156.51 0.000745 Coinbase 20153.28 0.000200 Coinbase 1 20157.52 0.050000 Coinbase 20152.27 0.051000 Coinbase 2 20158.52 0.000745 Coinbase 20151.28 0.000200 Kraken 3 20158.52 0.050000 FTX 20151.28 0.051000 Coinbase
需求为按相同价格分组,累加对应数量,并合并交易所名称(需避免重复拼接相同的交易所名称,例如不要出现CoinbaseCoinbase),预期输出如下:
asks_price asks_qty exchange_name_ask bids_price bids_qty exchange_name_bid 0 20156.51 0.000745 Coinbase 20153.28 0.000200 Coinbase 1 20157.52 0.050000 Coinbase 20152.27 0.051000 Coinbase 2 20158.52 0.050745 CoinbaseFTX 20151.28 0.051200 KrakenCoinbase
解决方案
订单簿的asks和bids属于独立的分组逻辑,可分别处理后再合并结果:
1. 处理asks侧数据
按asks_price分组,对asks_qty求和,对exchange_name_ask去重后拼接:
import pandas as pd # 构造原始DataFrame df = pd.DataFrame({ 'asks_price': [20156.51, 20157.52, 20158.52, 20158.52], 'asks_qty': [0.000745, 0.05, 0.000745, 0.05], 'exchange_name_ask': ['Coinbase', 'Coinbase', 'Coinbase', 'FTX'], 'bids_price': [20153.28, 20152.27, 20151.28, 20151.28], 'bids_qty': [0.0002, 0.051, 0.0002, 0.051], 'exchange_name_bid': ['Coinbase', 'Coinbase', 'Kraken', 'Coinbase'] }) # 分组聚合处理asks asks_grouped = df.groupby('asks_price').agg( asks_qty=('asks_qty', 'sum'), exchange_name_ask=('exchange_name_ask', lambda x: ''.join(pd.unique(x))) ).reset_index()
2. 处理bids侧数据
按bids_price分组,执行和asks侧相同的聚合逻辑:
# 分组聚合处理bids bids_grouped = df.groupby('bids_price').agg( bids_qty=('bids_qty', 'sum'), exchange_name_bid=('exchange_name_bid', lambda x: ''.join(pd.unique(x))) ).reset_index()
3. 合并处理结果
由于分组后asks和bids的行数一致,直接按索引列合并即可得到最终结果:
# 合并asks和bids的处理结果 result = pd.concat([asks_grouped, bids_grouped], axis=1) print(result)
关键说明
- 使用
pd.unique(x)对分组内的交易所名称去重,从根源避免重复拼接相同名称 groupby.agg支持同时对不同列应用不同聚合规则,一次完成数量求和与名称拼接- 最终用
pd.concat按列合并两组数据,完全匹配预期输出格式
内容的提问来源于stack exchange,提问作者Nathan
相关产品推荐
相关产品推荐

