如何在Pandas DataFrame中无循环实现条件差值计算
问题
现有如下Pandas DataFrame:
Date 1a 1b 112 2022-10-17 3.18 2.11 298 2022-10-16 4.26 7.00 340 2022-10-16 11.66 7.80 379 2022-10-16 15.78 2.13
要求在不使用循环的前提下,逐行判断1b列值是否大于1a列值:
- 满足条件时,新增
difference列存储两列差值(1b - 1a) - 不满足时填充0
最终目标DataFrame如下:
Date 1a 1b difference 112 2022-10-17 3.18 2.11 0 298 2022-10-16 4.26 7.00 2.74 340 2022-10-16 11.66 7.80 0 379 2022-10-16 15.78 2.13 0
解决方案
方法1:使用numpy.where(直观易懂)
numpy.where可根据条件选择对应结果,直接实现需求:
import pandas as pd import numpy as np # 假设原数据存储在df中 df['difference'] = np.where(df['1b'] > df['1a'], df['1b'] - df['1a'], 0)
方法2:使用Pandas mask方法
先计算所有行的差值,再用mask将不满足条件的结果替换为0:
df['difference'] = (df['1b'] - df['1a']).mask(df['1b'] <= df['1a'], 0)
方法3:使用Pandas clip方法
当1b <= 1a时,1b - 1a为非正值,直接用clip将负值截断为0:
df['difference'] = (df['1b'] - df['1a']).clip(lower=0)
以上三种方法均为矢量化操作,无需循环,处理大数据集时效率远高于逐行遍历。
内容的提问来源于stack exchange,提问作者T.Joost
相关产品推荐
相关产品推荐

