如何简化numpy向量化函数中多个pandas列参数的传入写法?
错误原因
- 语法错误:你定义的
func中np.prod后存在换行,相当于仅把np.prod函数本身赋值给newcol,后续的切片操作为独立无效语句,函数返回的是函数对象而非计算结果。 - 逻辑错误:直接传入完整df给
frompyfunc时,函数接收的是整个DataFrame而非单行数据,你试图用全列的age数组去做列表切片,自然触发类型不匹配报错。
最简高性能方案
优先推荐完全向量化的累积乘积方案,完全避免Python层面循环,性能远高于pd.apply和自定义ufunc,写法也极度简洁:
import numpy as np import pandas as pd from io import StringIO dfs = """ M0 M1 M2 M3 M4 M5 age 1 1 2 3 4 5 6 3.2 2 7 5 4 5 8 3 4.5 3 4 8 9 3 5 2 6.7 """ df = pd.read_csv(StringIO(dfs.strip()), sep='\s+', ) # 核心计算逻辑 m_arr = df.loc[:, 'M0':'M5'].values k = df['age'].astype(int).values - 1 # 转换为0起始索引 df['newcol'] = m_arr.cumprod(axis=1)[np.arange(len(df)), k]
运行后和你原逻辑输出完全一致。
保留自定义ufunc的简化写法
如果你坚持用np.frompyfunc的写法,可以将M列值和age打包为单参数传入,避免写7个入参:
def calc_prod(row_data): m_vals, age = row_data return np.prod(m_vals[:int(age)]) vfunc = np.frompyfunc(calc_prod, 1, 1) df['newcol'] = vfunc(list(zip(df.loc[:, 'M0':'M5'].values, df['age'].values)))
内容的提问来源于stack exchange,提问作者William
相关产品推荐
相关产品推荐

