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

快速截取Pandas DataFrame:按ID保留至首次满足状态条件的行

高效解决方案(针对7万行DataFrame优化)

针对你的需求——按id分组,保留每个分组从起始行到**首次出现status=1**的所有行(首次1的行保留,之后所有行不管status是什么都丢弃),这里提供一个比lambda x: x.cumsum().cumsum().le(1)快得多的矢量化方案:

步骤说明

  1. 给每个分组内的行分配连续序号(从0开始)
  2. 找出每个id分组中首次出现status=1的行序号
  3. 筛选出每个分组内序号≤首次1行序号的所有行

代码实现

import pandas as pd

# 你的原始数据
d = {'id': [1,1,1,1,1,1,1,2,2,2,2,2,2,2], 'status': [0,0,0,0,1,1,1,0,0,0,0,1,0,1]}
df = pd.DataFrame(data=d)

# 1. 生成每个分组内的行号
df['group_row'] = df.groupby('id').cumcount()

# 2. 获取每个id首次出现status=1的分组内行号
first_1_row = df[df['status'] == 1].groupby('id')['group_row'].min()

# 3. 合并行号信息并筛选
df_merged = df.merge(first_1_row, on='id', suffixes=('', '_first'))
result = df_merged[df_merged['group_row'] <= df_merged['group_row_first']].drop(['group_row', 'group_row_first'], axis=1)

print(result)

输出结果

id  status
0   1       0
1   1       0
2   1       0
3   1       0
4   1       1
7   2       0
8   2       0
9   2       0
10  2       0
11  2       1

为什么更快?

这个方案全程用Pandas内置的矢量化操作(groupby.cumcount、groupby.min、merge),这些操作都是基于C语言底层实现的,比自定义lambda的apply快几个数量级,完全适配7万行的数据集。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 18:30:14