0

0

Python如何按条件赋值_np.where()与列的条件分流赋值

P粉602998670

P粉602998670

发布时间:2026-03-15 08:47:52

|

761人浏览过

|

来源于php中文网

原创

np.where()是向量化三元表达式,格式为np.where(条件,真值,假值),需注意参数广播、布尔数组输入及dtype隐式转换;DataFrame中优先用df.loc布尔索引赋值,复杂逻辑可用np.select;务必检查并管理dtype以避免object类型导致的计算失败。

python如何按条件赋值_np.where()与列的条件分流赋值

np.where() 基本用法:三元条件选择别写错顺序

它不是“先判断再赋值”的语句,而是 np.where(条件, 真值, 假值) 的向量化三元表达式。常见错误是把真值和假值位置颠倒,比如想把负数变 0、正数保留原值,却写成 np.where(arr > 0, arr, 0) —— 这其实是对的;但有人误写成 np.where(arr > 0, 0, arr),结果全反了。

注意:三个参数都必须能广播(broadcast)对齐。如果传入标量、一维数组、二维数组混用,容易触发 ValueError: operands could not be broadcast together

  • 条件部分必须是布尔数组(不能是 Python 布尔值 True/False
  • 真值假值 可以是标量、数组,甚至 np.nanNone(但后者可能触发 dtype 自动转为 object
  • 若只传两个参数(如 np.where(mask)),返回的是满足条件的索引元组,不是赋值——这和条件赋值完全无关,别混用

Pandas 列条件赋值:df.loc 配合布尔索引比 np.where 更直观

在 DataFrame 中按列条件修改某列时,df.loc[条件, '列名'] = 新值 比嵌套 np.where 更易读、更安全。尤其当逻辑多层嵌套或需复用中间布尔结果时,loc 写法天然支持链式调试。

例如想把 df['score'] 中大于 90 的设为 'A',60–90 为 'B',其余 'C',直接用 np.where 嵌套三层容易出括号错位;而用 loc 分三步写,每步可单独 print 验证:

立即学习Python免费学习笔记(深入)”;

df.loc[df['score'] > 90, 'grade'] = 'A'
df.loc[(df['score'] >= 60) & (df['score'] <= 90), 'grade'] = 'B'
df.loc[df['score'] < 60, 'grade'] = 'C'
  • 布尔条件中多个条件必须用括号包裹,且用 &(不是 and)、|(不是 or
  • 避免直接对未存在的列赋值(如 df['new_col'][mask] = ...),会触发 SettingWithCopyWarning;务必用 df.loc[...]
  • 如果目标列 dtype 是 int,但赋了字符串,pandas 会自动转成 object,后续数值计算就炸了

性能对比:简单二分条件用 np.where,多分支优先考虑 np.select

当条件超过两个分支(比如五档评级),硬套 np.where(a, x, np.where(b, y, np.where(c, z, ...))) 不仅难维护,还慢——每层 np.where 都要完整扫描数组。

Giiso写作机器人
Giiso写作机器人

Giiso写作机器人,让写作更简单

下载

np.select 是为此设计的:它接受一个条件列表和对应取值列表,一次完成多路分流,底层更高效,也更贴近“查表”直觉:

conds = [df['score'] >= 90, df['score'] >= 80, df['score'] >= 70]
choices = ['A', 'B', 'C']
df['grade'] = np.select(conds, choices, default='D')
  • np.selectconds 是列表,顺序即优先级:前面条件为 True 就不再看后面的
  • default 参数必须显式指定,否则遇到全不匹配会填 np.nan(且 dtype 可能意外变成 float64
  • 如果条件之间有重叠(比如没加互斥约束),结果取决于列表顺序,这点和 if-elif-else 一致

dtype 隐式转换陷阱:赋值后数值列变 object 了怎么办

最常被忽略的一点:只要往原本是 int64 的列里塞了一个 strnp.nan,整列 dtype 就会悄悄升格为 object。之后再做 .sum().mean() 会报错或返回 NaN,而且内存占用翻几倍。

检查方式很简单:df['col'].dtype;修复也不难,但得提前想好缺失值怎么表达:

  • 如果允许缺失,统一用 pd.NA(配合 Int64string 等可空类型)
  • 如果必须数值,用 -1999 等哨兵值,但后续所有统计都得手动过滤
  • 别依赖 df['col'].astype('int') 强转——遇到 np.nan 直接报 ValueError: Cannot convert non-finite values (NA or inf) to integer

条件赋值这事,表面是语法选择,实际是 dtype 意识、缺失值策略和向量化思维的混合体。写完记得看一眼 df.dtypes,比跑十遍结果都管用。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
Python 时间序列分析与预测
Python 时间序列分析与预测

本专题专注讲解 Python 在时间序列数据处理与预测建模中的实战技巧,涵盖时间索引处理、周期性与趋势分解、平稳性检测、ARIMA/SARIMA 模型构建、预测误差评估,以及基于实际业务场景的时间序列项目实操,帮助学习者掌握从数据预处理到模型预测的完整时序分析能力。

82

2025.12.04

Python 数据清洗与预处理实战
Python 数据清洗与预处理实战

本专题系统讲解 Python 在数据清洗与预处理中的核心技术,包括使用 Pandas 进行缺失值处理、异常值检测、数据格式化、特征工程与数据转换,结合 NumPy 高效处理大规模数据。通过实战案例,帮助学习者掌握 如何处理混乱、不完整数据,为后续数据分析与机器学习模型训练打下坚实基础。

34

2026.01.31

python中print函数的用法
python中print函数的用法

python中print函数的语法是“print(value1, value2, ..., sep=' ', end=' ', file=sys.stdout, flush=False)”。本专题为大家提供print相关的文章、下载、课程内容,供大家免费下载体验。

193

2023.09.27

python print用法与作用
python print用法与作用

本专题整合了python print的用法、作用、函数功能相关内容,阅读专题下面的文章了解更多详细教程。

19

2026.02.03

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

1051

2023.08.02

if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

847

2023.08.22

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

761

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

221

2023.09.04

TypeScript类型系统进阶与大型前端项目实践
TypeScript类型系统进阶与大型前端项目实践

本专题围绕 TypeScript 在大型前端项目中的应用展开,深入讲解类型系统设计与工程化开发方法。内容包括泛型与高级类型、类型推断机制、声明文件编写、模块化结构设计以及代码规范管理。通过真实项目案例分析,帮助开发者构建类型安全、结构清晰、易维护的前端工程体系,提高团队协作效率与代码质量。

49

2026.03.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 22.5万人学习

Django 教程
Django 教程

共28课时 | 5万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号