如何在pandas中基于第三列条件在两列间选择值?禁用lambda函数
不用Lambda实现Pandas版Excel IF逻辑的几种方法
嘿,这个需求太常见了!不用lambda的话,咱们完全可以用pandas和numpy的原生矢量化操作来搞定,不仅效率比lambda+apply高得多,代码还更简洁易读。我给你分享几个实用的方案,先拿个示例数据集来演示:
import pandas as pd import numpy as np # 构造测试数据 df = pd.DataFrame({ 'Condition': [True, False, True, False], 'Column1': [10, 20, 30, 40], 'Column2': [100, 200, 300, 400] })
1. 最贴近Excel逻辑:np.where()
这个方法的语法和Excel的IF公式几乎一模一样,完全对应IF(条件, 真值返回值, 假值返回值)的结构:
df['NEW_COLUMN'] = np.where(df['Condition'], df['Column1'], df['Column2'])
执行后你的NEW_COLUMN就会根据Condition列的值,分别从Column1或Column2取数,完美复刻Excel的逻辑,而且是矢量化操作,大数据集下比lambda快N倍。
2. 可读性拉满:loc条件赋值
如果你喜欢分步操作,或者后续要扩展复杂条件,用loc索引来分步赋值会更清晰:
# 先给新列设置默认值(比如先取Column2的所有值) df['NEW_COLUMN'] = df['Column2'] # 再把满足Condition的行替换成Column1的值 df.loc[df['Condition'], 'NEW_COLUMN'] = df['Column1']
这种方式逻辑一目了然,新手也能快速看懂,适合需要多条件分支或者中间要做其他处理的场景。
3. Pandas原生方法:where()/mask()
Pandas自己也提供了类似的方法,where()和mask()是一对反向操作:
where(条件, 替代值):满足条件时保留原列值,不满足时用替代值mask(条件, 替代值):不满足条件时保留原列值,满足时用替代值
用where实现需求的代码:
df['NEW_COLUMN'] = df['Column1'].where(df['Condition'], df['Column2'])
用mask的话需要取反条件,效果一样:
df['NEW_COLUMN'] = df['Column1'].mask(~df['Condition'], df['Column2'])
这两个方法也是矢量化的,代码简洁,属于Pandas的惯用写法。
内容的提问来源于stack exchange,提问作者Abhijith N
相关产品推荐
相关产品推荐

