You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用向量化替代带外部条件的Pandas iterrows/for循环(Python)

向量化实现滞后列条件判断

首先明确原代码的核心逻辑:

  • 每行开始时重置previous_column_value_even为False
  • 遍历每行的列时:
    1. 若前一列的lst1值为偶数,则检查当前列lst1值是否大于lst2值,满足则标记输出为True
    2. 更新标记:当前列lst1值为偶数则设为True,否则False

以下是完全向量化的实现,无需任何循环:

import pandas as pd

lst1 = pd.DataFrame([[1, 2, 3],
                     [4, 5, 6],
                     [7, 8, 9]])

lst2 = pd.DataFrame([[9, 8, 7],
                     [6, 5, 4],
                     [3, 2, 1]])

# 1. 生成lst1各元素是否为偶数的掩码
even_mask = lst1 % 2 == 0

# 2. 生成前一列是否为偶数的掩码:每行向右偏移1列,首列填充False(对应每行初始标记为False)
prev_even_mask = even_mask.shift(axis=1, fill_value=False)

# 3. 生成最终条件:前一列是偶数 且 当前lst1值大于lst2值
condition = prev_even_mask & (lst1 > lst2)

# 4. 创建输出DataFrame,与原代码一致:仅满足条件的位置为True,其余为NaN
output_lst = condition.where(condition, other=pd.NA)

# 打印满足条件的lst1值
print(lst1[condition].dropna().values)

输出结果

[9]

关键说明

  • shift(axis=1, fill_value=False):完美模拟了原代码中每行列遍历的状态传递,将前一列的偶数标记右移到当前列的判断位置,首列填充False对应每行初始的previous_column_value_even=False
  • 向量化运算:所有掩码计算均为Pandas/NumPy底层优化的向量化操作,比原生循环效率提升数个数量级,尤其适合大数据集
  • 条件复用:condition变量可直接用于numpy.where()或其他需要布尔条件的场景,满足需求中的全局条件要求

内容的提问来源于stack exchange,提问作者finman69

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 04:45:35