pandas如何实现类似R ifelse功能,保留未匹配观测值不变
Pandas实现仅修改部分列观测、其余保留原值的解决方案
你原有代码报错的核心原因是:apply传入的lambda函数是对species列的单个元素逐个处理,函数作用域内不存在代表整列的species变量,直接写会触发未定义变量报错;给species加引号后就变成了固定字符串常量,所有不满足条件的元素都会被替换成这个固定字符串,自然不符合需求。
推荐实现方案
方案1:使用replace方法(最适配当前单值替换场景)
pandas的replace方法默认会保留未匹配到的原值,写法最简洁:
import pandas as pd # 读取数据集 iris = pd.read_csv('https://raw.githubusercontent.com/mwaskom/seaborn-data/master/iris.csv') # 仅替换setosa为set,其余值保留原列内容 iris = iris.assign( new_species = iris['species'].replace({'setosa': 'set'}) )
方案2:使用numpy.where(逻辑和R的ifelse完全对齐)
如果是更复杂的多条件判断场景,用numpy.where的逻辑和R的ifelse完全一致,直接把else分支设置为原列即可:
import pandas as pd import numpy as np iris = pd.read_csv('https://raw.githubusercontent.com/mwaskom/seaborn-data/master/iris.csv') iris = iris.assign( new_species = np.where(iris['species'] == 'setosa', 'set', iris['species']) )
方案3:使用.loc赋值(逻辑直观,适合非链式调用场景)
import pandas as pd iris = pd.read_csv('https://raw.githubusercontent.com/mwaskom/seaborn-data/master/iris.csv') # 先复制原列的值,再修改满足条件的行 iris['new_species'] = iris['species'].copy() iris.loc[iris['species'] == 'setosa', 'new_species'] = 'set'
以上三种方案都可以实现需求:仅将species为setosa的观测修改为set,其余Virginica、Versicolor的取值保持原列内容不变。
内容的提问来源于stack exchange,提问作者James
相关产品推荐
相关产品推荐

