如何用更简洁方式在Pandas中实现多条件IF逻辑生成新列?
用numpy.select简化Pandas中嵌套IF逻辑的列生成
需求背景
需要给Pandas DataFrame添加verify_col列,逻辑对应Excel的嵌套IF公式:
=IF(sum1=3,IF(AND(col1=col2,col2=col3),0,1),IF(sum1=2,IF(OR(col1=col2,col2=col3,col1=col3),0,1),IF(sum1=1,0,1)))
示例数据
import pandas as pd import numpy as np df = pd.DataFrame({ 'col1': ['BMW', 'Mercedes Benz', 'Lamborghini', 'Ferrari', np.nan], 'col2': ['BMW', 'Mercedes Benz', np.nan, np.nan, 'Tesla'], 'col3': ['BMW', 'Mercedes', 'Lamborghini', np.nan, 'Tesla_'], 'sum1': [3, 3, 2, 1, 2] })
期望生成的verify_col结果为[0, 1, 0, 0, 1],其中0表示无差异,1表示有差异。
简洁实现方案(numpy.select)
利用numpy.select的向量化操作,把所有判断条件和对应赋值清晰拆分,替代嵌套IF逻辑,代码更简洁且性能更优:
# 定义所有判断条件 conditions = [ # sum1=3 且三列完全相等 (df['sum1'] == 3) & (df['col1'] == df['col2']) & (df['col2'] == df['col3']), # sum1=3 但三列不全相等 (df['sum1'] == 3), # sum1=2 且任意两列相等 (df['sum1'] == 2) & ((df['col1'] == df['col2']) | (df['col2'] == df['col3']) | (df['col1'] == df['col3'])), # sum1=2 但任意两列都不相等 (df['sum1'] == 2), # sum1=1 (df['sum1'] == 1) ] # 对应条件的赋值结果 values = [0, 1, 0, 1, 0] # 生成目标列 df['verify_col'] = np.select(conditions, values, default=1)
验证结果
执行后查看verify_col:
print(df['verify_col'].tolist()) # 输出:[0, 1, 0, 0, 1]
方案优势
- 逻辑清晰:条件和赋值一一对应,比嵌套IF更易读和维护
- 性能高效:向量化操作避免逐行遍历,处理大数据集时优势明显
内容的提问来源于stack exchange,提问作者Jered
相关产品推荐
相关产品推荐

