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

Pandas合并分组排序后DataFrame时exchange_name列丢失问题求助

Pandas合并DataFrame后exchange_name列消失的问题

问题背景

我有两个Pandas DataFrame,希望将它们合并为一个。原始数据如下:

卖单数据:

asks_price  asks_qty exchange_name_ask
0      20156.51  0.000745          Coinbase
1      20156.52  0.050000          Coinbase

买单数据:

bids_price  bids_qty exchange_name_bid
2      20153.28  0.000200          Coinbase
3      20153.27  0.051000          Coinbase

期望合并结果:

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      20156.52  0.050000          Coinbase      20153.27  0.051000          Coinbase

编写的代码如下:

ask_snapshot = ask_snapshot.groupby('asks_price')['asks_qty'].sum().reset_index()
bid_snapshot = bid_snapshot.groupby('bids_price')['bids_qty'].sum().reset_index()
ask_snapshot = ask_snapshot.sort_values(by='asks_price').reset_index()
bid_snapshot = bid_snapshot.sort_values(by='bids_price', ascending=False).reset_index()
ask = ask_snapshot.head(20)
bid = bid_snapshot.head(20)

snapshot = pd.concat([ask, bid], axis=1, join='inner')

但合并后的snapshot中exchange_name相关列消失,不清楚原因。

原因分析

问题出在groupby操作的列选择上:

  • 执行ask_snapshot.groupby('asks_price')['asks_qty'].sum()时,仅指定按asks_price分组,且只对asks_qty做求和聚合,exchange_name_ask既不是分组键,也未被纳入聚合逻辑,因此会被直接丢弃。
  • 买单数据的exchange_name_bid列也在相同的groupby逻辑中被排除,导致后续合并后无法看到这两个列。

解决方案

修改groupby逻辑,将exchange_name相关列加入分组键,确保这些列被保留在结果中。如果同一价格对应的交易所名称唯一,此操作不会影响聚合结果;若同一价格下有多个交易所,会按「价格+交易所」的组合分组聚合数量:

# 处理卖单数据:保留exchange_name_ask列
ask_snapshot = ask_snapshot.groupby(['asks_price', 'exchange_name_ask']).agg({'asks_qty': 'sum'}).reset_index()
# 处理买单数据:保留exchange_name_bid列
bid_snapshot = bid_snapshot.groupby(['bids_price', 'exchange_name_bid']).agg({'bids_qty': 'sum'}).reset_index()

# 后续排序、取前20条、合并操作不变(添加drop=True避免生成多余索引列)
ask_snapshot = ask_snapshot.sort_values(by='asks_price').reset_index(drop=True)
bid_snapshot = bid_snapshot.sort_values(by='bids_price', ascending=False).reset_index(drop=True)
ask = ask_snapshot.head(20)
bid = bid_snapshot.head(20)

snapshot = pd.concat([ask, bid], axis=1, join='inner')

内容的提问来源于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 09:00:57