如何在Pandas中计算最长连续正负数值序列的求和结果?
解决方案
方法一:基于你现有代码修改(使用itertools.groupby)
你可以在分组时同时记录每个连续序列的长度和求和值,之后筛选出最长序列对应的和:
import pandas as pd from collections import defaultdict from itertools import groupby # 初始化DataFrame data = [10,-20,30,40,-50,60,12,-12,11,1,90,-20,-10,-5,-4] df = pd.DataFrame(data, columns=['Numbers']) streak = df['Numbers'].to_list() counter = defaultdict(list) # 按正负分组,记录每个连续序列的长度与和 for key, val in groupby(streak, lambda ele: "plus" if ele > 0 else "minus"): seq = list(val) counter[key].append( (len(seq), sum(seq)) ) # 获取最长连续正数序列的和 max_pos_length = max(item[0] for item in counter['plus']) sum_pos_max = next(item[1] for item in counter['plus'] if item[0] == max_pos_length) # 获取最长连续负数序列的和 max_neg_length = max(item[0] for item in counter['minus']) sum_neg_max = next(item[1] for item in counter['minus'] if item[0] == max_neg_length) print(f"Sum Pos Max Consecutive: {sum_pos_max}") print(f"Sum Neg Max Consecutive: {sum_neg_max}")
输出结果:
Sum Pos Max Consecutive: 102 Sum Neg Max Consecutive: -39
方法二:使用Pandas原生分组方法(更适合大数据场景)
利用Pandas的分组功能直接标记连续序列,再计算分组的长度与和:
import pandas as pd # 初始化DataFrame data = [10,-20,30,40,-50,60,12,-12,11,1,90,-20,-10,-5,-4] df = pd.DataFrame(data, columns=['Numbers']) # 标记每个元素的正负属性 df['sign'] = df['Numbers'].apply(lambda x: 'plus' if x > 0 else 'minus') # 创建连续序列的分组键:当正负属性变化时,分组号递增 df['group_id'] = (df['sign'] != df['sign'].shift()).cumsum() # 按正负属性+分组号聚合,计算每个连续序列的长度与和 group_stats = df.groupby(['sign', 'group_id']).agg( sequence_length=('Numbers', 'count'), sequence_sum=('Numbers', 'sum') ).reset_index() # 筛选出最长连续序列的和 sum_pos_max = group_stats[group_stats['sign'] == 'plus'].nlargest(1, 'sequence_length')['sequence_sum'].iloc[0] sum_neg_max = group_stats[group_stats['sign'] == 'minus'].nlargest(1, 'sequence_length')['sequence_sum'].iloc[0] print(f"Sum Pos Max Consecutive: {sum_pos_max}") print(f"Sum Neg Max Consecutive: {sum_neg_max}")
输出结果与方法一一致。
内容的提问来源于stack exchange,提问作者Divyank
相关产品推荐
相关产品推荐

