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

DataFrame基于start/stop列提取Seq列子串报错求助

解决Pandas按行提取Seq子串的问题

我来帮你搞定这个问题!你遇到的KeyError: ('start', 'occurred at index id')主要是两个小细节没处理对,咱们一步步拆解解决:

错误原因分析

  1. apply的轴参数不对:你调用df.apply()时没指定axis=1,默认是按列(axis=0)处理,这时候lambda x里的x代表每一列的Series,自然找不到"start"这个索引,所以抛出KeyError。
  2. 字符串切片的方法用错了:你的自定义函数里用z.str.slice(),但z其实是单个字符串(x["Seq"]是每行的单个Seq值),而.str.slice()是Pandas Series的方法,单个字符串直接用Python原生的切片[start:stop]就可以。

解决方案

方法1:修正apply的用法(适合简单场景)

先调整自定义函数,再指定按行处理:

import pandas as pd

# 构造测试数据
df = pd.DataFrame({
    "start": [50, 25],
    "stop": [121, 150],
    "Seq": ["aaaaaaaaaaaaabbbbbbbbbbbbccccccccccdddddd", "aaaaahhhhhhhsssssssssssssscccccccccdddddd"]
})

# 自定义按行处理的函数
def extract_subseq(row):
    # 直接用Python原生切片处理单个字符串
    return row["Seq"][row["start"]:row["stop"]]

# 调用apply时指定axis=1(按行处理)
df["subseq"] = df.apply(extract_subseq, axis=1)

或者用更简洁的lambda写法:

df["subseq"] = df.apply(lambda row: row["Seq"][row["start"]:row["stop"]], axis=1)

方法2:矢量化操作(更高效,推荐)

Pandas的str.slice()其实支持直接传入Series作为start和stop参数,不用循环/apply,速度快很多:

df["subseq"] = df["Seq"].str.slice(start=df["start"], stop=df["stop"])

这个方法避免了逐行处理的开销,尤其是数据量大的时候优势明显。

验证结果

运行后你会得到新增的subseq列,就是每行按start和stop提取的Seq子串啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 07:53:27