pandas筛选指定列值并提取其前后2500行对应另一列数据的方法问询
问题修复与实现代码
你原来的代码存在2个核心错误:
df.loc是行索引器,需使用方括号[]而非圆括号,且你写法拿到的是匹配的行数据,不是行的整数位置,无法直接用于iloc切片- 存在多个
start匹配行时,直接切片只会处理第一个匹配位置,无法覆盖所有试验区间
正确实现如下:
import numpy as np # 窗口大小:前后各2500行 WINDOW = 2500 # 拿到所有trialType为start的行的整数位置 start_positions = np.where(df['trialType'] == 'start')[0] total_rows = len(df) # 存储所有需要保留的行位置 keep_rows = [] for pos in start_positions: # 边界处理,避免下标越界 left = max(0, pos - WINDOW) right = min(total_rows - 1, pos + WINDOW) keep_rows.extend(range(left, right + 1)) # 去重并按原数据顺序排序,避免重叠区间重复取数 keep_rows = sorted(list(set(keep_rows))) # 提取结果 result = df.iloc[keep_rows].copy()
如果你的业务要求重叠区间的行要重复保留(不需要去重),删掉set()处理步骤即可:
keep_rows = sorted(keep_rows)
小数据示例验证
针对你给出的小数据示例,如果把窗口调整为前后各1行,start的位置是0和3:
- 第一个start的区间是
max(0,0-1)=0到min(5,0+1)=1,对应行0、1 - 第二个start的区间是
max(0,3-1)=2到min(5,3+1)=4,对应行2、3、4 - 合并后取行0-4,结果符合预期
内容的提问来源于stack exchange,提问作者KateP
相关产品推荐
相关产品推荐

