Pandas:移除按账户和标的分组开头的Sell交易行
用Pandas高效移除分组内首个Buy前的Sell行
这里的“分组”指account和symbol字段值完全相同的行集合,以下是高效实现方案,替代低效的iterrows遍历:
1. 先拿示例数据试手
假设你的交易数据结构如下,先构造测试用的DataFrame:
import pandas as pd data = { 'account': ['A1', 'A1', 'A1', 'A2', 'A2', 'A2', 'A2'], 'symbol': ['GOOG', 'GOOG', 'GOOG', 'MSFT', 'MSFT', 'MSFT', 'MSFT'], 'type': ['Sell', 'Sell', 'Buy', 'Sell', 'Buy', 'Sell', 'Buy'], 'quantity': [-10, -5, 20, -3, 15, -8, 10], 'price': [140, 142, 138, 280, 275, 285, 270] } df = pd.DataFrame(data)
2. 核心分组处理逻辑
用groupby+apply做批量处理,比逐行遍历快得多:
def clean_group(group): # 定位分组内第一个Buy记录的索引 first_buy_pos = group[group['type'] == 'Buy'].index.min() # 要是分组里没Buy记录,直接返回原组(也可以改成返回空表删掉整组) if pd.isna(first_buy_pos): return group # 只保留第一个Buy及之后的所有行 return group.loc[first_buy_pos:] # 按account和symbol分组执行清洗 result_df = df.groupby(['account', 'symbol'], group_keys=False).apply(clean_group)
3. 效果验证
处理后,每个分组里首个Buy之前的Sell行都会被删掉:
- 比如A1分组的前两行Sell会被移除,只保留从Buy开始的记录;
- A2分组会删掉第一个Buy之前的那行Sell,保留后续所有交易记录。
为什么这个方案高效?
完全利用Pandas的分组向量化操作,避免了iterrows逐行循环的性能瓶颈,就算是几十万甚至上百万行的大数据量,处理速度也能跟上。
内容的提问来源于stack exchange,提问作者Bowen Liu
相关产品推荐
相关产品推荐

