如何用Pandas Groupby筛选所有STATUS对应STRATEGY均为SELL的债券
筛选所有STATUS下策略均为SELL的债券
问题背景
现有如下包含债券投资策略的DataFrame,需要筛选出所有STATUS类型下STRATEGY列均为SELL的债券(示例中仅债券B符合条件):
import pandas as pd df = pd.DataFrame({'BOND': {0: 'A', 1: 'A', 2: 'B', 3: 'B', 4: 'C', 5: 'C', }, 'STATUS': {0: 'SENIOR', 1: 'SUBORDINATED', 2: 'SENIOR', 3: 'SUBORDINATED', 4: 'SENIOR', 5: 'SUBORDINATED', }, 'STRATEGY': {0: 'BUY', 1: 'SELL', 2: 'SELL', 3: 'SELL', 4: 'BUY', 5: 'SELL', }})
原DataFrame输出:
BOND STATUS STRATEGY 0 A SENIOR BUY 1 A SUBORDINATED SELL 2 B SENIOR SELL 3 B SUBORDINATED SELL 4 C SENIOR BUY 5 C SUBORDINATED SELL
期望输出:
BOND STATUS STRATEGY 2 B SENIOR SELL 3 B SUBORDINATED SELL
解决方案
通过Pandas的groupby函数可以实现需求,步骤如下:
- 按
BOND分组,验证每组的STRATEGY是否全部为'SELL' - 提取符合条件的债券名称
- 从原DataFrame中筛选出这些债券的所有行
完整代码:
# 分组验证并获取符合条件的债券 valid_bonds = df.groupby('BOND')['STRATEGY'].apply(lambda x: (x == 'SELL').all()) valid_bonds = valid_bonds[valid_bonds].index # 筛选目标行 result = df[df['BOND'].isin(valid_bonds)] print(result)
代码说明
groupby('BOND')['STRATEGY'].apply(lambda x: (x == 'SELL').all()):对每个债券组,检查该债券所有STATUS对应的策略是否都是SELL,返回一个以债券名为索引的布尔Seriesvalid_bonds[valid_bonds].index:筛选出布尔值为True的债券名称,得到符合条件的债券列表df[df['BOND'].isin(valid_bonds)]:从原DataFrame中提取这些债券的所有记录,得到最终结果
内容的提问来源于stack exchange,提问作者Ben
相关产品推荐
相关产品推荐

