我有以下声明:
>>> df['result'] = df['value'].apply(myfunc, args=(x,y,z))
Python函数myfunc是在我开始使用Pandas之前编写的,并且设置为采用单个值。参数x和z是固定的,可以轻松地作为变量或文字形式传递,但是我的DataFrame中有一列代表y参数,因此我正在寻找一种对每一行使用该行值的方法(逐行不同。
即df ['y']是我要发送到myfunc的一系列值
我的解决方法如下:
values = list(df['value'])
y = list(df['y'])
df['result'] = pd.Series([myfunc(values[i],x,y[i],z) for i in range(0,len(values))])
还有更好的方法吗?
编辑
使用functools.partial可以解决问题。如果您的呼叫不坚持使用关键字参数,那么它似乎求助于位置,然后您可能会遇到'myfunc()获得多个值...'错误。
我修改了Coldspeed的答案:
# Function myfunc takes named arguments arg1, arg2, arg3 and arg4
# The values for arg2 and arg4 don't change so I'll set them when
# defining the partial (assume x and z have values set)
myfunc_p = partial(myfunc, arg2=x, arg4=z)
df['result'] = [myfunc_p(arg1=w, arg3=y) for w, y in zip(df['value'], df['y'])]
答案 0 :(得分:1)
我认为您在做什么很好。我可能会做一些改进:
from functools import partial
myfunc_p = partial(myfunc, x=x, z=z)
df['result'] = [myfunc_p(v, y) for v, y in zip(df['value'], df['y'])]
您不需要将列表包装在pd.Series
调用中,并且可以通过使用functools.partial
固定两个参数来清理函数调用。
还有另一个使用np.vectorize
的选项(免责声明,它实际上并未向量化该函数,只是隐藏了循环),以获取更简洁的代码,但是在大多数情况下,列表理解应该更快。
myfunc_v = np.vectorize(partial(myfunc, x=x, z=z))
df['result'] = myfunc_v(df['value'], df['y'])
答案 1 :(得分:1)
您也可以像这样apply
在行上lambda
:
df['result'] = df.apply(lambda row: myfunc(row['value'], y=row['y'], x=x, z=z), axis=1)