使用pandas df.eval赋值字符串时报ValueError: data type must provide an itemsize
Pandas eval赋值字符串报错:ValueError: data type must provide an itemsize
复现代码
import pandas as pd df = pd.DataFrame(dict(a=[1,2,3])) df=df.eval('x=2') # 此语句正常执行 df.eval('y="num"') # 此处执行失败
报错信息
ValueError: data type must provide an itemsize
问题背景
该问题仅在新版Pandas中出现,旧版本无此异常。已知df['y']="num"或df.assign(y='num')可实现赋值,但需求是必须通过eval/query完成;尝试过np.str_("num")仍无效,df.query操作也会触发相同错误。
问题原因
新版Pandas的eval在处理标量字符串时,内部会尝试将其转换为支持向量化操作的数组类型,但纯字符串标量无法直接生成带有itemsize属性的固定长度字符串数组,进而导致类型转换失败。而数值标量(如示例中的2)能被自动广播为与DataFrame行数匹配的数值列,因此可以正常执行。
可行解决方案
方案1:生成同长度字符串数组赋值
在eval表达式中,借助原DataFrame的列长度生成对应长度的字符串列表,让Pandas能正确识别并创建字符串列:
df.eval('y = ["num"] * len(a)')
这里利用现有列a的长度来生成等长字符串列表,确保与DataFrame行数一致。
方案2:通过@引入外部变量
先定义字符串变量,再在eval中用@符号引用该变量,Pandas会自动完成标量到列的广播:
s = "num" df.eval('y = @s')
这种方式规避了eval内部处理纯字符串标量时的类型转换问题,能够正常生成字符串列。
内容的提问来源于stack exchange,提问作者lisrael1
相关产品推荐
相关产品推荐

