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
相关产品推荐
相关产品推荐

