如何使用np.select返回所有满足条件的选项并合并结果?
问题
我有一个pandas DataFrame,需要逐行检查哪些条件为True。当存在多个满足的条件时,希望返回所有对应的选项并合并,该如何实现?
示例代码:
df = pd.DataFrame({'cond1':[True, True, False, True], 'cond2':[False, False, True, True], 'cond3':[True, False, False, True], 'value': [1, 3, 3, 6]}) conditions = [df['cond1'] & (df['value']>4), df['cond2'], df['cond2'] & (df['value']>2), df['cond3'] & df['cond2']] choices = [ '1', '2', '3', '4'] df["class"] = np.select(conditions, choices, default=np.nan)
当前输出:
cond1 cond2 cond3 value class 0 True False True 1 NaN 1 True False False 3 NaN 2 False True False 3 2 3 True True True 6 1
期望输出:
cond1 cond2 cond3 value class 0 True False True 1 NaN 1 True False False 3 NaN 2 False True False 3 2 and 3 3 True True True 6 1 and 2 and 3 and 4
解决方案
np.select的逻辑是返回第一个匹配条件对应的结果,无法直接返回所有满足条件的选项。要实现需求,可以通过以下步骤处理:
- 将所有条件转换为布尔值组成的DataFrame,每行对应原数据的行,每列对应一个条件的判断结果
- 逐行筛选出布尔值为True的位置,匹配对应的
choices选项 - 用
' and '连接每行的所有匹配选项,无匹配项则设为NaN
实现代码:
import pandas as pd import numpy as np df = pd.DataFrame({'cond1':[True, True, False, True], 'cond2':[False, False, True, True], 'cond3':[True, False, False, True], 'value': [1, 3, 3, 6]}) conditions = [df['cond1'] & (df['value']>4), df['cond2'], df['cond2'] & (df['value']>2), df['cond3'] & df['cond2']] choices = [ '1', '2', '3', '4'] # 把条件列表转为布尔DataFrame,行列对应原数据行和各个条件 cond_matrix = pd.DataFrame(conditions).T # 逐行处理:筛选符合条件的选项并合并 df['class'] = cond_matrix.apply( lambda row: ' and '.join([choices[i] for i, is_true in enumerate(row) if is_true]), axis=1 ) # 将空字符串替换为NaN,与原逻辑保持一致 df['class'] = df['class'].replace('', np.nan) print(df)
运行后即可得到期望的输出结果。
内容的提问来源于stack exchange,提问作者corianne1234
相关产品推荐
相关产品推荐

