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

Python中Pandas DataFrame场景下exec函数无法运行问题求助

解决exec执行DataFrame筛选条件的问题

我明白你的处境——虽然清楚直接执行用户输入代码的风险,但已经过公司安全确认,现在就聚焦解决exec无法正常工作的问题。

首先,咱们先拆解下核心问题:你从CSV单元格读取到的筛选条件是列表形式的字符串(比如["source_data.loc[source_data['CONFIG_ID'] == 3]"]),而exec需要的是合法的Python代码字符串;另外,source_data.loc[...]本质是一个返回DataFrame的表达式,用eval可能比exec更适配场景,下面给你具体的解决方案:

第一步:处理读取后的内容格式

如果读取后的结果是列表,首先要把里面的代码字符串提取出来,确保传入执行函数的是纯代码文本:

# 假设你从CSV读取后得到的列表是condition_list
condition_code = condition_list[0]  # 取出列表中的代码字符串
# 先打印确认下,避免读取到转义错误的字符串
print("提取到的筛选代码:", condition_code)

第二步:选择合适的执行方式

方式1:用eval直接获取筛选结果

因为source_data.loc[...]是一个表达式(会返回筛选后的DataFrame),eval专门用于计算这类表达式并返回结果,比exec更直接:

# 显式传入命名空间,确保source_data能被访问到
filtered_data = eval(condition_code, globals(), {"source_data": source_data})
# 查看结果
print("筛选后的DataFrame:")
print(filtered_data)

方式2:用exec执行赋值语句

如果你一定要用exec,需要把表达式转换成赋值语句,这样执行后就能拿到结果变量:

# 把表达式包装成赋值语句
exec_code = f"filtered_data = {condition_code}"
# 执行代码
exec(exec_code)
# 此时filtered_data变量已被赋值
print("筛选后的DataFrame:")
print(filtered_data)

常见问题排查

如果还是报错,你可以从这几个方向检查:

  • 字符串转义问题:CSV存储时可能会把单引号转义(比如变成''),打印condition_code看看是否和你预期的代码一致;
  • 命名空间问题:如果source_data不在exec/eval的访问范围内,会报NameError,这时候显式传入命名空间(比如上面的{"source_data": source_data})就能解决;
  • 语法错误:用户输入的代码可能有语法问题,比如少了括号、引号不匹配,先手动运行一遍代码确认是否合法。

完整示例代码

import pandas as pd

# 模拟你的初始DataFrame
source_data = pd.DataFrame({
    "CONFIG_ID": [1, 2, 3, 3, 4],
    "VALUE": ["a", "b", "c", "d", "e"]
})

# 模拟从CSV单元格读取后的列表
condition_list = ["source_data.loc[source_data['CONFIG_ID'] == 3]"]

# 提取代码字符串
condition_code = condition_list[0]

# 用eval执行的示例
filtered_data_eval = eval(condition_code)
print("=== 用eval得到的结果 ===")
print(filtered_data_eval)

# 用exec执行的示例
exec(f"filtered_data_exec = {condition_code}")
print("\n=== 用exec得到的结果 ===")
print(filtered_data_exec)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:08:54