如何用向量化替代带外部条件的Pandas iterrows/for循环(Python)
向量化实现滞后列条件判断
首先明确原代码的核心逻辑:
- 每行开始时重置
previous_column_value_even为False - 遍历每行的列时:
- 若前一列的lst1值为偶数,则检查当前列lst1值是否大于lst2值,满足则标记输出为True
- 更新标记:当前列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
相关产品推荐
相关产品推荐

