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

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.050745          CoinbaseFTX   20151.28  0.051200       KrakenCoinbase

更新订单簿时需要删除指定交易商的行,最初用以下代码:

self.global_orderbook = self.global_orderbook[
                self.global_orderbook.exchange_name_ask != name]

以Coinbase为例,执行后结果如下:

asks_price  asks_qty exchange_name_ask     bids_price  bids_qty exchange_name_bid
0    20158.52  0.050745          CoinbaseFTX   20151.28  0.051200       KrakenCoinbase

但我希望删除所有包含指定名称的行(比如上面的CoinbaseFTX和KrakenCoinbase都要删掉),尝试过以下两种方法但都无效:

  • 直接用in判断,语法错误:
self.global_orderbook = self.global_orderbook[name not in self.global_orderbook.exchange_name_ask]
  • 尝试用contains方法,但提示Series没有该属性:
self.global_orderbook = self.global_orderbook[self.global_orderbook.exchange_name_ask.contains(name)]
# 报错:'Series' object has no attribute 'contains'
解决方法

Pandas的Series对象判断字符串包含需要用str.contains()方法,结合布尔取反(~)就能筛选出不包含指定名称的行。

仅处理ask列的代码

# 筛选出exchange_name_ask中不包含name的行
self.global_orderbook = self.global_orderbook[~self.global_orderbook.exchange_name_ask.str.contains(name)]

同时处理ask和bid列的代码

如果需要把bid列中包含指定名称的行也一并删除,用逻辑与(&)组合条件:

# 同时排除ask列和bid列中包含name的行
mask = ~self.global_orderbook.exchange_name_ask.str.contains(name) & ~self.global_orderbook.exchange_name_bid.str.contains(name)
self.global_orderbook = self.global_orderbook[mask]

补充说明

  • str.contains()是Pandas字符串专属方法,必须通过Series.str调用,直接用Series.contains()会报错,这就是之前出错的核心原因。
  • ~符号用来对布尔Series取反,保留不满足条件的行。
  • 如果需要忽略大小写匹配,可以添加case=False参数:str.contains(name, case=False)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 21:02:10