如何用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循环的写法存在两个问题:
- 逻辑错误:循环中直接对整个
PO列赋值(get_JournalData_05['PO'] = 'None'),会覆盖所有行的数据,而非仅当前行。 - 性能低下:
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
相关产品推荐
相关产品推荐

