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

如何在Pandas DataFrame中按Condition区块重置并查找最低Low值

找出连续Below区块中的最低Low值

问题背景

给定如下示例DataFrame:

import pandas as pd

df = pd.DataFrame.from_dict(
{
    'Low': [3001,2984,2973,2976,2977,2980,2985,2970,2956,2960],
    'Close' : [3004,2986,2980,2985,2996,2990,2992,2975,2970,2965],
    'Condition'  : ['Above', 'Below', 'Below', 'Below', 'Above', 
                    'Above','Below','Below','Below','Above']
})

对应的表格:

Low  Close Condition
0   3001   3004     Above
1   2984   2986     Below
2   2973   2980     Below
3   2976   2985     Below
4   2977   2996     Above
5   2980   2990     Above
6   2985   2992     Below
7   2970   2975     Below
8   2956   2970     Below
9   2960   2965     Above

需要实现的需求:遍历数据,找出每个连续Condition='Below'区块中的最低Low值,当Condition切换为Above时重置统计,最终得到如下格式的结果:

Low
2  2973
8  2956

解决方案

利用Pandas的分组功能,通过标记连续区块的ID来实现分组统计:

方法一:生成分组ID后统计

  1. 生成连续区块的分组标识:每次遇到Condition='Above'时,累积求和生成递增的分组ID,确保同一连续Below区块的行拥有相同ID:
df['group_id'] = (df['Condition'] == 'Above').cumsum()
  1. 过滤并分组统计:筛选出Condition='Below'的行,按分组ID分组后,找到每组Low值最小的行索引,再转换为DataFrame:
result = df[df['Condition'] == 'Below'].groupby('group_id')['Low'].idxmin().to_frame()

执行后即可得到目标结果。

方法二:一行式简化写法

无需额外生成group_id列,直接在groupby中传入分组标识:

result = df[df['Condition'] == 'Below'].groupby(
    (df['Condition'] == 'Above').cumsum()
)['Low'].idxmin().to_frame()

特殊情况处理

如果同一Below区块中存在多个相同的最低Low值,且需要取最后一次出现的行,可以使用以下代码:

result = df[df['Condition'] == 'Below'].groupby(
    (df['Condition'] == 'Above').cumsum()
).apply(lambda x: x[x['Low'] == x['Low'].min()].iloc[-1])['Low'].to_frame()

内容的提问来源于stack exchange,提问作者Ben

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 18:49:14