熊猫Series.apply-使用其他系列的参数吗?

时间:2018-08-11 22:59:25

标签: python pandas

我有以下声明:

>>> 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'])]

2 个答案:

答案 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)