假设我们有以下函数:
def f(x,y):
y = x + y
return y
函数f(x,y)
对两个数字求和(但它可以是两个参数的任何或多或少复杂的函数)。现在让我们考虑以下内容
import pandas as pd
import random
import numpy as np
random.seed(1234)
df = pd.DataFrame({'first': random.sample(range(0, 9), 5),
'second': np.NaN}, index = None)
y = 1
df
first second
0 7 NaN
1 1 NaN
2 0 NaN
3 6 NaN
4 4 NaN
对于问题的范围,数据框的第二列在这里无关紧要,因此我们可以不失一般性地假设它为NaN
。让我们将 f(x,y)
应用于数据帧的每一行,考虑到变量 y
已初始化为 1。第一次迭代返回 7+1 = 8;现在,当再次将该函数应用于第二行时,我们希望将 y 值更新为之前计算的 8,因此最终结果为 1+8 =9,依此类推.
处理这个问题的Pythonic方法是什么?我想避免循环并重新分配循环内的变量,因此我的猜测是这样的
def apply_to_df(df, y):
result = df['first'].apply(lambda s: f(s,y))
return result
但是,人们可以很容易地看出,上面的代码没有考虑更新的值,而是使用 y=1
的初始原始值来计算所有计算。
print(apply_to_df(df,y))
0 8
1 2
2 1
3 7
4 5
最佳答案
请注意,您可能可以使用现有的累积函数来解决这个特定情况。但是,在一般情况下,您可以通过依赖全局状态来破解它:
In [7]: y = 1
In [8]: def f(x):
...: global y
...: y = x + y
...: return y
...:
In [9]: df['first'].apply(lambda s: f(s))
Out[9]:
0 8
1 9
2 9
3 15
4 19
Name: first, dtype: int64
I want to avoid looping and re-assigning the variables inside the loop
注意,pd.DataFrame.apply
是底层的普通 Python 循环,它实际上效率较低,因为它对输入进行了大量检查/验证。它不是为了高效,而是为了方便。因此,如果您关心性能,那么如果您依赖 .apply
老实说,我认为我宁愿在函数内部的行上编写显式循环,也不愿依赖全局状态。
关于python - 应用具有更新值的 lambda 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44707094/