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

如何对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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 12:15:38