如何获取Pandas分组连续数值序列的每组最大值与最小值
解决连续数字分组的最值计算问题
嘿,我懂你遇到的问题了——你已经成功把连续数字分组并拼接成字符串,但现在想获取每个分组的最大和最小值,试了好几次都没搞定对吧?其实不用先把分组转成字符串再反向处理,我们可以直接在分组阶段就计算最值,这样既简单又高效。
方法一:直接对原始数据分组计算(推荐)
我们可以复用你之前创建分组键的逻辑,但不把分组转成字符串,而是直接对原始数值计算最值:
import pandas as pd values = [5, 6,7,8 , 9, 11,12, 13, 14, 17, 18,19, 20, 21,22, 23, 24, 25, 26, 27, 41, 42, 44, 45, 46, 47] s = pd.Series(values) # 创建分组键,和你之前的逻辑一致:当后一个数和前一个数的差大于1时,开启新分组 group_keys = s.diff().gt(1).cumsum() groups = s.groupby(group_keys) # 一次性计算每个分组的最小值和最大值 group_stats = groups.agg(最小值='min', 最大值='max') print(group_stats)
运行后你会得到这样的结果:
最小值 最大值 0 5 9 1 11 14 2 17 27 3 41 42 4 44 47
这种方法不需要做字符串和数值的转换,直接基于原始数据计算,效率更高,也更不容易出错。
方法二:从已拼接的字符串分组反向计算(如果已经有s1)
如果你已经生成了s1那个拼接好的字符串Series,也可以反向处理得到最值:
# 假设你已经有了s1 s1 = s.groupby(group_keys).apply(lambda x: ','.join(x.astype(str))) # 对每个字符串分组,分割后转成int列表,再计算最值 stats_from_s1 = s1.apply( lambda x: pd.Series([int(num) for num in x.split(',')]) ).agg({'min': 'min', 'max': 'max'}, axis=1) print(stats_from_s1)
这个方法的逻辑是:先把每个字符串按逗号分割成单个数字字符串,转成int类型的列表,再转成临时Series,最后对每行(每个分组)计算min和max。不过这种方法多了字符串转换的步骤,数据量大的时候不如第一种方法高效。
总结
优先推荐第一种方法,直接基于原始数值分组计算最值,既简洁又高效。如果是因为某些原因必须从已有的字符串分组处理,第二种方法也能解决问题。
内容的提问来源于stack exchange,提问作者user9238790
相关产品推荐
相关产品推荐

