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

如何获取总和绝对值最大的连续负数序列(需至少两个连续)

解决:提取总和绝对值最大的连续负数序列(至少2个连续负数)

原始数据与需求

原始DataFrame

import pandas as pd

df = pd.DataFrame(
    {
        'a': [-3, -1, -2, -5, 10, -3, -13, -3, -2, 1, -200, -100],
    }
)

需求

  • 提取总和绝对值最大的连续负数序列
  • 要求该序列至少包含2个连续的负数行

期望输出

a
10 -200
11 -100

原代码问题分析

你写的代码有两个关键问题:

  1. 未过滤长度不足2的负数组:原代码会把所有连续负数组都纳入计算,但需求明确要求序列至少有2个连续负数,单一行的负数组应该被排除
  2. 最大值判断逻辑错误:负数的总和是负数,sum().idxmax()会取总和最大(最接近0)的组,但我们需要的是总和绝对值最大(最负)的组,这里应该用绝对值后的最大值判断,或者直接取总和最小的组

修正后的代码实现

import pandas as pd
import numpy as np

df = pd.DataFrame(
    {
        'a': [-3, -1, -2, -5, 10, -3, -13, -3, -2, 1, -200, -100],
    }
)

# 1. 标记负数行,生成连续分组的键
is_negative = df['a'] < 0
group_key = is_negative.ne(is_negative.shift()).cumsum()

# 2. 筛选出仅包含负数、且长度≥2的有效组
negative_groups = df[is_negative].groupby(group_key)
valid_negative_groups = negative_groups.filter(lambda x: len(x) >= 2)

# 3. 找到总和绝对值最大的组的键
group_sums = valid_negative_groups.groupby(group_key)['a'].sum()
target_group_key = group_sums.abs().idxmax()

# 4. 提取目标组数据
result = df[group_key == target_group_key]
print(result)

运行后输出:

a
10 -200
11 -100

代码说明

  • 用df['a'] < 0直接标记负数行,比np.sign更精准(避免0的干扰,适配更多场景)
  • 通过filter排除长度不足2的组,严格符合需求中的“至少两个连续负数”要求
  • 用abs().idxmax()明确找到总和绝对值最大的组,逻辑更直观,不容易出错

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 12:25:05