如何将Excel定义的逻辑运算公式应用到Pandas DataFrame?
解决通过Excel定义逻辑条件为Pandas DataFrame添加布尔列的问题
问题概述
需要从test.xlsx文件的Formula列读取逻辑条件(而非Python硬编码),为Pandas DataFrame生成布尔列,需同时满足三个逻辑:
GOOD列值大于Excel定义的阈值BAD列值小于Excel定义的阈值UGLY列不为空值
前置信息
Excel文件test.xlsx结构示例
假设Formula列存储了拆分的三个条件:
| Formula |
|---|
| GOOD > 80 |
| BAD < 20 |
| UGLY.notna() |
示例DataFrame
import pandas as pd df = pd.DataFrame({ 'GOOD': [75, 85, 90, 60], 'BAD': [15, 25, 18, 22], 'UGLY': ['val1', None, 'val3', 'val4'] })
常见错误尝试
直接使用eval()会因作用域问题无法识别DataFrame列:
formula_df = pd.read_excel('test.xlsx', usecols=['Formula']) formulas = formula_df['Formula'].tolist() # 此代码会抛出NameError,因为eval无法识别GOOD/BAD/UGLY列 df['result'] = eval(' & '.join(formulas))
可行解决方案
使用Pandas内置的df.eval()方法,它支持直接引用DataFrame列,且语法兼容Pandas表达式:
import pandas as pd # 1. 读取Excel中的逻辑条件 formula_df = pd.read_excel('test.xlsx', usecols=['Formula']) # 合并多个条件为单一逻辑表达式 combined_formula = ' & '.join(formula_df['Formula'].astype(str)) # 2. 读取目标DataFrame(此处用示例数据,实际替换为你的数据源) df = pd.DataFrame({ 'GOOD': [75, 85, 90, 60], 'BAD': [15, 25, 18, 22], 'UGLY': ['val1', None, 'val3', 'val4'] }) # 3. 应用公式生成布尔列 df['result'] = df.eval(combined_formula)
适配Excel风格公式
如果Excel中存储的是Excel原生语法(如NOT(ISBLANK(UGLY))),需先转换为Pandas兼容语法:
# 转换Excel公式为Pandas表达式 formula_series = formula_df['Formula'].astype(str).replace({ 'NOT(ISBLANK(': 'UGLY.notna(', '>': ' > ', '<': ' < ' }) combined_formula = ' & '.join(formula_series) df['result'] = df.eval(combined_formula)
最终输出结果
运行代码后,DataFrame将生成符合预期的布尔列:
GOOD BAD UGLY result 0 75 15 val1 False 1 85 25 None False 2 90 18 val3 True 3 60 22 val4 False
内容的提问来源于stack exchange,提问作者Alexander
相关产品推荐
相关产品推荐

