【发布时间】:2020-01-12 08:46:08
【问题描述】:
我想在不使用 for 循环的情况下迭代 pandas 数据帧中的给定函数,即使用矢量化。
我已经为这个函数写了一个for循环但是我想提高这个输出的效率。
def f(x,y,operation):
if operation=='add':
return x+y
elif operation=='power':
return x**y
else:
print('type can only be power or add')
df = pd.DataFrame({
'first_entry':[1,np.nan,np.nan,np.nan,np.nan],
'operation':[np.nan,'plus','power','plus','plus'],
'operand':[np.nan,3,2,4,1]
})
first_entry operation operand expected_result
1 NA NA 1
NA plus 3 4 (= 1+3)
NA power 2 16 (=4**2)
NA plus 4 20 (=16+4)
NA plus 1 21 (=20+1)
我想回来
pd.Series(1,4,16,20,21),即在数据帧上迭代 f
替代问题: 现在假设
def g(x,y,operation):
if operation=='relative':
return x*(1+y)
elif operation=='absolute':
return x+y
else:
print('type can only be relative or absolute')
我可以编写一个带有列表理解的函数来给出预期的结果吗?
first_entry operation operand expected_result
1 NA NA 1
NA relative 3 4 (= 1*(3+1)
NA absolute 2 6 (=4+2)
NA relative 4 30 (=6*(4+1)
NA absolute 1 31 (=30+1)
【问题讨论】:
-
您在寻找apply吗?
-
Apply 不会迭代工作。例如,我知道 .cumsum() 是迭代的,所以我想有效地使用不同的函数进行迭代。
-
@rafaelc 是否可以使用列表理解? cumsum() 不是依赖于先前计算值的可向量化函数
-
我同意@rafaelc,这很难矢量化,因为每次迭代都会更新值。如果您对 非矢量化 解决方案感兴趣,我可以发布一个。
-
在我的实际示例中,函数 f(a,b,operation) 对于 operation==operation1 返回 a+b,对于 operation==operation2 返回 a*(1+b)。您认为这可以通过列表理解来实现吗?如果可以,如何实现?
标签: python pandas vectorization