如何用列表推导式检查DataFrame指定列非零值并新增标记列
解答
完全可以用列表推导式实现该需求,但更推荐使用pandas原生向量化方案,运行效率远高于手写循环。
推荐方案(性能最优)
直接利用pandas内置方法实现,自带短路校验逻辑(命中该行第一个非零值就停止后续判断),和你预期的执行逻辑完全一致,不需要手写嵌套循环:
# 提取需要校验的目标列列表 pattern_cols = pattern_accuracy["Pattern"].tolist() # 逐行判断非零值,将布尔结果转为0/1后直接赋值 df_raw["Pattern Exists"] = df_raw[pattern_cols].ne(0).any(axis=1).astype(int)
逻辑说明:
ne(0)是pandas原生的“不等于0”判断方法,会批量生成所有目标单元格的布尔值对比结果any(axis=1)按行做逻辑或判断,只要该行存在一个True就返回True,内置短路逻辑,不会做多余计算astype(int)把True/False布尔值直接转为1/0整数,完全匹配你的赋值规则
列表推导式实现方案
如果需要严格使用列表推导式,配合生成器表达式的短路特性即可实现和原代码break完全一致的效果,性能比你当前写的嵌套for循环更好:
pattern_cols = pattern_accuracy["Pattern"].tolist() df_raw["Pattern Exists"] = [ 1 if any(val != 0 for val in row[pattern_cols]) else 0 for _, row in df_raw.iterrows() ]
原代码注意事项
你当前编写的嵌套循环使用了链式索引写法(df_raw['Pattern Exists'].loc[row]),在pandas中很容易触发SettingWithCopyWarning警告,且逐行逐单元格遍历的方式在数据量较大时运行速度会非常慢,非特殊场景不建议使用。
内容的提问来源于stack exchange,提问作者R M
相关产品推荐
相关产品推荐

