在Pandas链式调用中使用带条件的lambda表达式报错求助
解决Pandas链式调用assign中除零错误的问题
错误原因
你写的x['a'] != 0会返回一个布尔类型的Series,而Python的if语句需要单个布尔值,Pandas无法判断你要基于整个Series的哪种逻辑(比如是否所有元素都满足,还是任意元素满足),因此抛出ValueError。
可行解决方案
以下几种方法都能在链式调用的assign中实现需求,且都是向量化操作,效率远高于循环判断:
方法1:使用numpy.where(最直观的向量化条件判断)
import numpy as np thedf.assign(division=lambda x: np.where(x['a'] != 0, x['b'] / x['a'], 0))
np.where会逐个检查x['a'] != 0的布尔值,满足条件时计算x['b']/x['a'],不满足时返回0。
方法2:使用Pandas的mask方法
thedf.assign(division=lambda x: (x['b'] / x['a']).mask(x['a'] == 0, 0))
先计算所有除法结果(此时a=0的位置会得到inf),再用mask把x['a'] == 0的位置替换为0。
方法3:使用div结合replace处理无穷值
import numpy as np thedf.assign(division=lambda x: x['b'].div(x['a']).replace([np.inf, -np.inf], 0))
div是Pandas的除法方法,当除数为0时会生成无穷值inf,再用replace把所有正负无穷值替换为0。
验证结果
以上三种方法运行后都会得到预期输出:
a b division 0 10 9 0.9 1 20 16 0.8 2 0 15 0.0
内容的提问来源于stack exchange,提问作者Alexis
相关产品推荐
相关产品推荐

