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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 20:12:17