Pandas调用np.vectorize生成新列报setting an array element错误
问题原因及解决方案
错误产生原因
- 你的
test函数逻辑存在根本错误:函数内调用的df4[str(i)].values返回的是整个列的全量数组,不是当前行对应列的单个值,导致每次调用test返回的是长度和df4一致的数组,而非预期的单个标量结果 np.vectorize预期对每个输入的RB值返回一个标量,但实际得到的是数组,往df4的新列赋值时,就会触发ValueError: setting an array element with a sequence,因为无法把一个数组塞到DataFrame的单个单元格中- 额外说明:
np.vectorize仅为语法糖,不会真正实现并行计算,效率远低于pandas原生操作,不推荐在该场景下使用
修复方案
你要实现的逻辑是:对每一行,将列名从RB列的取值到49的所有列的数值相乘,生成新列n,可以直接用pandas的行级apply实现,完整代码如下:
import pandas as pd from io import StringIO import numpy as np # df4生成代码保持不变 df4s = """ contract RB BeginDate ValIssueDate EndDate Valindex0 48 46 47 49 50 2 A00118 46 19850100 19880901 99999999 50 1 2 3 7 7 3 A00118 47 19000100 19880901 19831231 47 1 2 3 7 7 5 A00118 47 19850100 19880901 99999999 50 1 2 3 7 7 6 A00253 48 19000100 19820101 19811231 47 1 2 3 7 7 7 A00253 48 19820100 19820101 19841299 47 1 2 3 7 7 8 A00253 48 19850100 19820101 99999999 50 1 2 3 7 7 9 A00253 50 19000100 19820101 19781231 47 1 2 3 7 7 10 A00253 50 19790100 19820101 19841299 47 1 2 3 7 7 11 A00253 50 19850100 19820101 99999999 50 1 2 3 7 7 """ df4 = pd.read_csv(StringIO(df4s.strip()), sep='\s+', dtype={"RB": int, "BeginDate": int, "EndDate": int,'ValIssueDate':int,'Valindex0':int}) # 修复后的计算逻辑 def calc_n(row): rb_val = row['RB'] calc_cols = [str(i) for i in range(rb_val, 50)] # RB等于50时没有需要计算的列,返回初始值1,和你原有逻辑一致 return row[calc_cols].prod() if calc_cols else 1 df4['n'] = df4.apply(calc_n, axis=1)
内容的提问来源于stack exchange,提问作者William
相关产品推荐
相关产品推荐

