如何编写可扩展高性能Python条件语句 转换复杂嵌套Excel IF公式
Excel嵌套IF公式转Python实现方案
核心转换逻辑
Excel的IF(条件, 满足返回值, 不满足返回值)嵌套结构,直接对应Python的if-elif-else分支结构,为了提升可读性,建议将优先级最高的判断条件前置,减少嵌套层级。
如果是处理表格类数据,推荐用pandas库实现,列名直接对应Excel列名,支持全表批量处理,无需逐行循环。
前置准备
- 固定常量定义:Excel中的绝对引用
$BJ$5、$BJ$6提前定义为常量,填入实际数值即可。 - 函数映射:
AND(条件1,条件2):单条数据对应条件1 and 条件2,pandas批量处理对应(条件1) & (条件2)OR(条件1,条件2):单条数据对应条件1 or 条件2,pandas批量处理对应(条件1) | (条件2)SUM(列1:列2):直接对对应列做加法运算AVERAGE(列1:列2):对对应列取均值VLOOKUP:提前将匹配表的匹配列和返回列转为字典,比如vlookup_map = dict(zip(匹配表['匹配列'], 匹配表['返回列'])),取值用vlookup_map.get(匹配值, 默认值)避免匹配不到报错。
单条数据转换示例(按原公式嵌套逻辑)
def get_review_reason( DG, G, H, BV, AC, AR, J, K, CK, DP, M, N, DN, DD, E, I, DH, BK_SUM, CI, L, AB, AA, O_AB_AVG, AQ, AP, AD_AQ_AVG, vlookup_A_val, CN, BJ5, BJ6, vlookup_map ): # 第一层判断 if DG == 1 and (G+H) > 8*BV and (G+H) > 0 and (AC+AR) < 10: return 0 # 第二层判断 elif DG == 1 and (G+H) >30: return 0 # 第三层判断 DG-J>0的分支 elif DG - J > 0: if K == 1: if CK <3: return "NLA" else: return "auto_URGENTE" if DP ==1 else "auto" else: if (M + N) >0: return "Quality Block" if M ==5 else "Active Replacement" else: if DN ==1: return "Demand" if DG >0 else 0 else: if CK > BJ5: if DD >0 and E ==1: return "auto_URGENTE" if DP ==1 else "auto" else: if I >0: return "External PO" else: if DH ==0 and DP ==0: return 0 else: return "auto_URGENTE" if DP ==1 else "auto" elif CK > BJ6: return "auto_URGENTE" if DP ==1 else "auto" else: return "Critical" # 剩余分支 else: if (G+H+I+J + BK_SUM) <0 and CI>0: return "BO" else: if f"{K}{L}{M}{N}" == "0000": cond1 = (AB + AA)*0.4 < O_AB_AVG cond2 = (AQ + AP)*0.4 < AD_AQ_AVG if cond1 or cond2: if (G+I+H+J) < (AB+AA+AQ+AP): vlookup_val = vlookup_map.get(vlookup_A_val, 0) if vlookup_val > (AA+AB+AP+AQ): return "Possible BO" if CN <0 else 0 else: return 0 else: return 0 else: return 0 else: return 0
注意事项
- 所有参与数值运算的变量提前确认是数值类型,避免字符串参与计算报错
- 求和、均值计算的列范围可以根据实际Excel列对应调整
- 批量处理全表数据时,用pandas的
apply方法调用上面的函数,或者用np.where写向量化判断,运行效率远高于逐行循环。
内容的提问来源于stack exchange,提问作者Yan
相关产品推荐
相关产品推荐

