Pandas技术实现:如何按特定规则生成布尔值新列?
优化解决方案
原代码问题分析
你当前的循环逻辑存在覆盖赋值的问题:每遍历一列就会重新设置boost_prev的值,最终结果只由最后一列的判断决定,这就是为什么第一行明明有1.0,但boost_prev却被设为False(因为最后一列是0.0 <1)。此外,循环处理列的方式在列数增多时效率极低,不符合Pandas的向量化操作原则。
向量化实现方案
利用Pandas的向量化方法,无需循环即可高效完成判断,完美匹配你的三个规则:
import pandas as pd import numpy as np # 假设handicap_test_cols是你的目标DataFrame # 1. 判断每行是否存在1 has_one = handicap_test_cols.isin([1]).any(axis=1) # 2. 判断每行是否全为0 all_zero = handicap_test_cols.eq(0).all(axis=1) # 3. 按规则生成Boosted列 handicap_test_cols['Boosted'] = np.select( [has_one, all_zero], [True, np.nan], default=False )
逻辑说明
has_one:检查每行任意一列是否包含1,返回布尔序列all_zero:检查每行所有列是否都是0,返回布尔序列np.select:按顺序匹配条件,优先匹配has_one(设为True),其次匹配all_zero(设为NaN),剩下的情况(只有-1和0且不全为0)设为False
验证示例
用你提供的测试数据验证:
wk_handicap0 wk_handicap1 Boosted 0 1.0 0.0 True 194 0.0 0.0 NaN # 假设有一行是[-1, 0],Boosted会是False
内容的提问来源于stack exchange,提问作者Nathan Pared
相关产品推荐
相关产品推荐

