为什么pandas.map中手动给sympy.Set传参报错而lambda动态传参正常
核心问题根因
变量名错误
你示例代码中创建的DataFrame变量为test,但后续调用未定义的test1,请先统一变量名。
直接实例化Set抽象基类的兼容问题
SymPy官方文档明确说明Set是所有集合类型的抽象基类,不推荐直接实例化,你遇到的报错本质是旧版本SymPy对Set单参数实例化的处理逻辑缺陷:
- 你动态传参时用
sp.Set(*x):x为字符串,*x会拆分为N个单字符参数传入,属于多参数调用,兼容逻辑正常 - 你手动传固定参数时用
sp.Set('hi',):仅传入1个字符串参数,属于单参数调用,SymPy内部会尝试把参数当成SymPy内置类型读取args属性,普通字符串没有该属性,因此抛出AttributeError: 'str' object has no attribute 'args'
隐藏逻辑错误
你手动传固定参数的写法逻辑和动态传参不统一:
- 动态传参
sp.Set(*x)是把字符串拆分为单个字符作为集合元素,比如x='hi'得到的集合是{'h','i'} - 你手动写的
sp.Set('hi')是把整个hi字符串作为唯一元素,得到的集合是{'hi'},和动态传参的逻辑完全不一致
解决方法
- 改用SymPy的
FiniteSet子类创建有限元素集合,这是官方推荐的有限集合实例化方式,不存在单参数调用的兼容问题 - 固定参数需要拆分字符串为单个字符时,和动态传参保持一致添加
*拆包符 - for循环传入迭代变量时,直接对迭代变量拆包即可
修正后代码示例
单固定值测试
import sympy as sp import pandas as pd test = pd.DataFrame( {'greeting':['hey','hi','hello','howdy']} ) # 判断{'h','i'}是否为当前行字符集合的真子集 test['greeting'].map(lambda x: sp.FiniteSet(*'hi').is_proper_subset(sp.FiniteSet(*x)))
for循环迭代测试
keywords = ['hi', 'he', 'ho'] for kw in keywords: test[f'has_{kw}_chars'] = test['greeting'].map(lambda x: sp.FiniteSet(*kw).is_proper_subset(sp.FiniteSet(*x)))
内容的提问来源于stack exchange,提问作者avnav99
相关产品推荐
相关产品推荐

