Pandas基于flag列计算value相对前一个True行的百分比变化无循环实现
解决方案
以下是全矢量化的实现方案,无任何显式循环,百万行级数据也可高效处理:
完整代码
import pandas as pd # 构造示例DataFrame df = pd.DataFrame({ 'value': [1.0, 1.1, 1.2, 1.3, 10.0, 10.1, 10.2, 10.3, 10.4, 10.5], 'flag': [True, False, False, False, True, False, False, False, False, False] }) # 1. 给每个以flag=True开头的区间生成分组ID df['group_id'] = df['flag'].cumsum() # 2. 提取每个分组的基准值(即分组内flag=True行的value值) df['base_val'] = df.groupby('group_id')['value'].transform('first') # 3. 计算百分比变化,flag=True的行直接置为0 df['value'] = ((df['value'] - df['base_val']) / df['base_val'] * 100).where(~df['flag'], 0) # 删除辅助列 df.drop(columns=['group_id', 'base_val'], inplace=True) print(df)
输出结果
value flag 0 0.0 True 1 10.0 False 2 20.0 False 3 30.0 False 4 0.0 True 5 1.0 False 6 2.0 False 7 3.0 False 8 4.0 False 9 5.0 False
逻辑说明
- 用
cumsum对flag列累加,每遇到一个True分组ID就+1,自动将相邻的、同属一个True开头区间的行归为同一组 - 用
groupby.transform('first')批量提取每个分组的基准值,避免逐行查找前序最近的True行 - 最后用
where做条件赋值,全程为pandas原生矢量化操作,性能远高于循环实现
内容的提问来源于stack exchange,提问作者rindis
相关产品推荐
相关产品推荐

