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

如何用Python高效实现指定Excel函数功能?

实现Excel的IFERROR+MID+FIND功能(Python Pandas优化版)

需求说明

要实现的Excel函数逻辑:

=IFERROR(MID(E14330,FIND("-0",E14330)-3,9),"None")

即从Description列(对应Excel的E列)中找到-0的起始位置,截取该位置往前3位开始的连续9个字符;如果找不到-0,则填充"None"。

原代码问题

你之前用iterrows循环的写法存在两个问题:

  1. 逻辑错误:循环中直接对整个PO列赋值(get_JournalData_05['PO'] = 'None'),会覆盖所有行的数据,而非仅当前行。
  2. 性能低下:iterrows是逐行遍历,处理大数据量时速度极慢;lambda函数报错大概率是因为未正确处理find("-0")返回-1的边界情况。

优化方案(矢量化操作)

方案1:基于已有的zero index列

利用Pandas的矢量化字符串操作,避免逐行循环,大幅提升速度:

# 先获取"-0"的索引位置(已有的代码)
get_JournalData_05['zero index'] = get_JournalData_05['Description'].str.find('-0')

# 计算截取的起始和结束位置
start_pos = get_JournalData_05['zero index'] - 3
end_pos = start_pos + 9

# 截取字符串,找不到"-0"的位置会返回NaN,用fillna替换为"None"
get_JournalData_05['PO'] = get_JournalData_05['Description'].str.slice(start=start_pos, stop=end_pos).fillna("None")

方案2:无需额外索引列(更简洁)

直接用apply结合lambda,同时处理边界情况:

get_JournalData_05['PO'] = get_JournalData_05['Description'].apply(
    lambda x: x[x.find('-0')-3 : x.find('-0')+6] if x.find('-0') != -1 else "None"
)

注:这里结束位置用x.find('-0')+6是因为起始位置+9 = (pos-3)+9 = pos+6,和MID的长度参数9对应。

为什么更快?

Pandas的矢量化操作(str.slice、apply)是基于底层优化的批量处理,比iterrows逐行操作效率高几个数量级,尤其适合大数据集。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 16:16:21