pandas assign新增列触发ufunc multiply签名不匹配报错求解
报错原因
报错的核心是运算符使用不符合pandas/numpy的数组运算规则:
- Python原生标量运算支持
字符串 * 整数的语法,效果是把字符串重复整数次生成新字符串,但这个规则不会自动适配pandas的Series数组运算 - 你写的
"9"*x.column1.astype('int')中,*会被numpy识别为逐元素乘法运算,此时运算符左侧是字符串类型,右侧是整数类型的Series,numpy的multiply通用函数没有适配「字符串乘整数生成重复字符串」的逻辑,找不到类型匹配的运算循环,就抛出如下报错:
ufunc 'multiply' did not contain a loop with signature matching types (dtype('<U21'), dtype('<U21')) ->dtype('<U21')
解决方法
选择以下任意一种写法都可以实现预期的列生成效果:
- 方法1:使用pandas内置的字符串重复方法
str.repeat,适配数组运算逻辑
df2 = df.assign( column2 = lambda x: "B:" + "9".repeat(x.column1.astype('int')) )
- 方法2:使用列表推导逐行计算,逻辑直观且运行效率高
df2 = df.assign( column2 = ["B:" + "9" * int(val) for val in df['column1']] )
运行上述代码后,得到的DataFrame结构完全符合预期:
| 行索引 | column1 | column2 |
|---|---|---|
| row1 | 2 | B:99 |
| row2 | 5 | B:99999 |
| row3 | 10 | B:9999999999 |
内容的提问来源于stack exchange,提问作者정유립
相关产品推荐
相关产品推荐

