如何在Pandas中对多列使用mask方法替换负值?
问题
我有一个包含20列的数据集,只需要把ArrDelay和DepDelay两列里的负值替换成0。但数据里有字符串类型的列,没法对全量数据用mask方法;单独对一列用mask能正常跑,但想同时处理这两列。
当前代码:
data = data.mask(data.ArrDelay.lt(0),0) #how to add 'DepDelay'? data
数据集示例:
FlightNum ArrDelay DepDelay TailNum Month Dest 3232 3 -6 432G 1 ORX 4342 -2 4 476N 2 TOL 6344 -1 -4 643G 3 JFK 7564 5 13 653A 4 CVO
期望结果:
FlightNum ArrDelay DepDelay TailNum Month Dest 3232 3 0 432G 1 ORX 4342 0 4 476N 2 TOL 6344 0 0 643G 3 JFK 7564 5 13 653A 4 CVO
解决方案
方法1:指定列应用mask
直接选中目标列,只对这两列执行mask操作,不会影响其他字符串列:
cols = ['ArrDelay', 'DepDelay'] data[cols] = data[cols].mask(data[cols] < 0, 0)
方法2:用clip简化操作
clip函数可以直接把数值限制在指定区间,这里设置下限为0,所有小于0的值都会被替换成0,代码更简洁:
cols = ['ArrDelay', 'DepDelay'] data[cols] = data[cols].clip(lower=0)
方法3:apply逐列处理
如果需要自定义更复杂的逻辑,也可以用apply对目标列逐个处理:
cols = ['ArrDelay', 'DepDelay'] data[cols] = data[cols].apply(lambda x: x.mask(x < 0, 0))
内容的提问来源于stack exchange,提问作者Toshik
相关产品推荐
相关产品推荐

