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

Python中如何创建值为未求值表达式的字典以生成Pandas合成数据框

问题

我需要用Python的Faker和Random函数生成动态Pandas合成数据框,计划通过构建字典作为数据源:部分列设为静态值,部分列基于用户输入,通过表达式或Faker对象生成对应值。

比如要生成5行2列的合成数据框,输入参数为:

col1 = 1
col2 = ('1', '2')

期望构建的字典为:

dict1 = {
        'col1': 1,
        'col2': fake.random_element(elements=('1','2'))
     }

原本的生成代码如下:

from faker import Faker  
import pandas as pd

fake = Faker()  

def generate_fake_data(numRows, inputDict):
    output = [
                 inputDict for x in range(numRows)
            ]
    
    return output

num_records = 5
df_sythetic = pd.DataFrame(generate_fake_data(num_records, dict1))

但现在遇到问题:如果想避免提前求值,表达式会被当作字符串存储,比如:

dict1 = {
        'col1': 1,
        'col2': 'fake.random_element(elements=('1','2'))'
     }

请问如何创建字典,使这类表达式既不被提前求值,也不会被当作字符串处理?

解决方案

方法1:用可调用对象(Lambda)存储动态生成逻辑

把需要动态生成的列值包装成可调用的Lambda函数,这样每次生成行数据时才会执行生成逻辑,既不会提前求值,也不需要用字符串存储。

修改后的完整代码:

from faker import Faker  
import pandas as pd

fake = Faker()  

# 构建字典:静态值直接存储,动态逻辑用Lambda包装
dict1 = {
    'col1': 1,
    'col2': lambda: fake.random_element(elements=('1', '2'))
}

def generate_fake_data(numRows, inputDict):
    output = []
    for _ in range(numRows):
        # 遍历字典:判断值是否可调用,是则执行取结果,否则直接用静态值
        row = {key: value() if callable(value) else value for key, value in inputDict.items()}
        output.append(row)
    return output

num_records = 5
df_synthetic = pd.DataFrame(generate_fake_data(num_records, dict1))
print(df_synthetic)

这样每一行的col2都会重新调用Faker生成新值,不会出现所有行值相同的问题。

方法2:自定义生成函数(复杂场景适用)

如果生成逻辑比较复杂(比如需要多步计算),Lambda不够用,可以定义专门的生成函数:

def generate_col2():
    # 这里可以添加复杂逻辑,比如先判断再返回
    return fake.random_element(elements=('1', '2'))

dict1 = {
    'col1': 1,
    'col2': generate_col2
}

生成函数和方法1一致,只需判断值是否可调用并执行即可。

注意:避免用eval()处理字符串表达式

把生成逻辑写成字符串后用eval()执行虽然能实现需求,但存在严重的安全风险(比如恶意代码注入),绝不推荐使用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 14:57:40