如何在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后统计
- 生成连续区块的分组标识:每次遇到
Condition='Above'时,累积求和生成递增的分组ID,确保同一连续Below区块的行拥有相同ID:
df['group_id'] = (df['Condition'] == 'Above').cumsum()
- 过滤并分组统计:筛选出
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
相关产品推荐
相关产品推荐

