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

如何在Pandas中高效提取300码与前序200码间的行并添加批次列

Pandas高效提取指定批次行的实现方案

原始数据

import pandas as pd

data = {
    'c1': [1, 1, 1, 2, 6, 6, 9, 1, 9, 8, 1, 2, 8, 9],
    'c2': [2, 5, 2, 4, 1, 1, 8, 6, 2, 1, 2, 5, 0, 1],
    'c3': [3, 7, 3, 1, 1, 5, 2, 9, 1, 2, 1, 3, 4, 2],
    'code': [200, 220, 200, 340, 370, 270, 300, 700, 200, 400, 200, 900, 300, 620]
}
df = pd.DataFrame(data)

需求说明

找到每一行code=300的记录,定位其**最近的前序code=200**的记录,提取这两个标记行之间的所有行(包含标记行本身),并添加batch_num列区分不同批次。

目标结果

c1  c2  c3  code  batch_num
0   1   2   3   200          0
1   2   4   1   340          0
2   6   1   1   370          0
3   6   1   5   270          0
4   9   8   2   300          0
5   1   2   1   200          1
6   2   5   3   900          1
7   8   0   4   300          1

实现步骤

1. 标记关键行并定位批次端点

先提取code=200和code=300的行索引,再为每个code=300行匹配最近的前序code=200行:

# 提取两类关键行的索引
idx_200 = df[df['code'] == 200].index
idx_300 = df[df['code'] == 300].index

# 用searchsorted快速匹配(大数据集更高效)
matched_200_idx = idx_200[idx_200.searchsorted(idx_300, side='right') - 1]

# 生成每个批次的索引区间:(起始200索引, 结束300索引)
batch_ranges = list(zip(matched_200_idx, idx_300))

2. 为行分配批次号

遍历每个批次区间,为区间内的行设置对应批次编号:

# 初始化批次列为空值
df['batch_num'] = pd.NA

for batch_num, (start, end) in enumerate(batch_ranges):
    df.loc[start:end, 'batch_num'] = batch_num

3. 筛选并整理结果

过滤出有效批次行,重置索引并调整数据类型:

# 筛选有批次号的行,重置索引
result = df[df['batch_num'].notna()].reset_index(drop=True)
# 转换批次号为整数类型
result['batch_num'] = result['batch_num'].astype(int)

print(result)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 04:55:20