假设我们有一个如下所示的示例数据帧:

df = pd.DataFrame({'A': [np.nan, 0.5, 0.5, 0.5, 0.5], 
                   'B': [np.nan, 3, 4, 1, 2], 
                   'C': [10, np.nan, np.nan, np.nan, np.nan]})
>>> df
     A    B     C
0  NaN  NaN  10.0
1  0.5  3.0   NaN
2  0.5  4.0   NaN
3  0.5  1.0   NaN
4  0.5  2.0   NaN

第‘D’列是通过以下运算计算的:

>>> df
     A    B     C     D
0  NaN  NaN  10.0  10.0 
1  0.5  3.0   NaN   8.0 = (10 x 0.5) + 3
2  0.5  4.0   NaN   8.0 = (8 x 0.5) + 4 
3  0.5  1.0   NaN   5.0 = (8 x 0.5) + 1 
4  0.5  2.0   NaN   4.5 = (5 x 0.5) + 2 

计算列‘D’反映了在每个行操作中调用列‘C’的前一行和列‘A’和‘B’的当前行的折叠过程.

我try 过使用for循环、functools.reduce()和迭代器来实现这一点,但我想知道是否有另一种方法可以尽可能多地使用向量化,以便在更大的数据集中使此操作更有效.

推荐答案

I'm not aware of pure vectorized pandas/numpy solution, but you can try to use to speed up the computation:

from numba import njit


@njit
def calculate(A, B, starting_value=10):
    out = np.empty_like(A, dtype=np.float64)

    out[0] = starting_value

    for i, (a, b) in enumerate(zip(A[1:], B[1:]), 1):
        out[i] = (out[i - 1] * a) + b

    return out


df["D"] = calculate(df["A"].values, df["B"].values, 10)
print(df)

打印:

     A    B     C     D
0  NaN  NaN  10.0  10.0
1  0.5  3.0   NaN   8.0
2  0.5  4.0   NaN   8.0
3  0.5  1.0   NaN   5.0
4  0.5  2.0   NaN   4.5

Python相关问答推荐

如何在BeautifulSoup中链接Find()方法并处理无?

DataFrame groupby函数从列返回数组而不是值

将jit与numpy linSpace函数一起使用时出错

带条件计算最小值

删除任何仅包含字符(或不包含其他数字值的邮政编码)的观察

使可滚动框架在tkinter环境中看起来自然

Godot:需要碰撞的对象的AdditionerBody2D或Area2D以及queue_free?

如何使用Python以编程方式判断和检索Angular网站的动态内容?

如何使Matplotlib标题以图形为中心,而图例框则以图形为中心

如何更新pandas DataFrame上列标题的de值?

Pandas GroupBy可以分成两个盒子吗?

* 动态地 * 修饰Python中的递归函数

ModuleNotFoundError:没有模块名为x时try 运行我的代码''

为什么我的sundaram筛这么低效

Tensorflow tokenizer问题.num_words到底做了什么?

如何在验证文本列表时使正则表达式无序?

如何提高Pandas DataFrame中随机列 Select 和分配的效率?

查找数据帧的给定列中是否存在特定值

是否需要依赖反转来确保呼叫方和被呼叫方之间的分离?

Python:在cmd中添加参数时的语法