如何扩展Pandas中基于多条件的np.where列计算逻辑
多条件下的DataFrame列分类实现方法
嗨,你已经掌握了单条件下用np.where生成分类列的技巧,要扩展到多条件场景其实很简单,这里给你两种常用且高效的方法:
方法一:使用np.select(灵活适配任意多条件)
np.select可以定义多个条件和对应的结果,非常适合非连续、自定义的多规则场景。比如你提到的:
- 年龄小于20 → 'kid'
- 年龄在20到50之间(含20,不含50)→ 'adult'
- 年龄大于等于50 → 'senior'
直接看代码示例:
import pandas as pd import numpy as np # 构造你的数据 data = {'name': ['Jason', 'Molly', 'Tina', 'Jake', 'Amy', 'Tom'], 'age': [42, 52, 36, 24, 73, 18], 'preTestScore': [4, 24, 31, 2, 3, 10], 'postTestScore': [25, 94, 57, 62, 70, 40]} df = pd.DataFrame(data, columns = ['name', 'age', 'preTestScore', 'postTestScore']) # 定义条件列表和对应的结果列表 conditions = [ df['age'] < 20, (df['age'] >= 20) & (df['age'] < 50), df['age'] >= 50 ] choices = ['kid', 'adult', 'senior'] # 生成category列 df['category'] = np.select(conditions, choices, default='unknown')
运行后你会看到Tom(18岁)被标记为kid,Jason(42岁)是adult,Molly(52岁)是senior,完美匹配需求。如果有特殊情况没覆盖到,还可以用default参数设置默认值。
方法二:使用pd.cut(适合连续区间划分)
如果你的分类是基于连续的数值区间,pd.cut会更简洁,它可以直接把数值按区间分组并分配标签:
# 定义区间和对应标签 bins = [0, 20, 50, float('inf')] labels = ['kid', 'adult', 'senior'] # 生成category列 df['category'] = pd.cut(df['age'], bins=bins, labels=labels, right=False)
这里的right=False表示区间是左闭右开(比如[0,20)对应小于20,[20,50)对应20到50之间),和我们的需求一致。如果需要右闭左开,把right改成True即可。
这两种方法都能轻松解决多条件分类的问题,你可以根据自己的场景选择:如果条件是自定义的非连续规则,选np.select;如果是连续区间划分,pd.cut更省心。
内容的提问来源于stack exchange,提问作者Bharat Sharma
相关产品推荐
相关产品推荐

