python - 应用具有更新值的 lambda 函数

标签 python pandas dataframe lambda

假设我们有以下函数:

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/

相关文章:

python - 如何修改zabbix脚本?

python - 如何在 Pandas 中过滤 shift +/- 1 天?

python-3.x - 使用 pandas 进行多类分类的总体准确性

r - 在使用 ldpy 将数据帧列表合并为一个之前/之后向数据帧的每一行添加标识符

python - 如何串联或取消串联 pandas 数据框中的字符串值?

python - `logging.basicConfig(level=logging.INFO)` 是否应该只接受 INFO 级别的日志记录?

python - 如何在Python中设置溢出减法以得到零?

python - 对 pandas 中相同的列名进行分组

python - 在 pandas 系列/列中查找最新版本号

python - 用于删除跨列具有相同内容的连续重复行的数据框