You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 03:18:02