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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 07:09:22