如何用Pandas cut()按4条记录分组并计算指定列最大值?
我来帮你排查下问题,并且给出正确的实现方案~
你的代码里有两个关键问题导致结果不符合预期:
- 分组逻辑错误:你用了
range(0, len(dataset), 3),步长设成3但实际要的是每4条一组,步长应该是4;而且pd.cut是基于数值区间的分组方式,对于从0开始的索引,第一个区间(0,4]会漏掉索引0,直接导致分组不完整。 - 聚合逻辑不符合需求:直接调用
groups.max()会对所有列取最大值,但你需要的是仅对指定列计算max,其余列保持原样(要么保留组内原行,要么保留组内某一行的内容)。
方案1:生成每组一行的汇总数据集
如果你的需求是每组输出一行,其余列保留组内第一行的内容,仅目标列显示组内最大值,可以这样写:
import pandas as pd # 替换成你要计算max的目标列名 target_col = "your_target_column" # 按每4行分组:索引//4 会把0-3分到组0,4-7分到组1,以此类推 groups = dataset.groupby(dataset.index // 4) # 自定义聚合规则:非目标列取组内第一行,目标列取max result = groups.agg( {col: "first" for col in dataset.columns if col != target_col} | {target_col: "max"} ) # 可选:重置索引让结果更整洁 result = result.reset_index(drop=True) # 导出为CSV result.to_csv("grouped_max_result.csv", index=False)
方案2:给原数据集添加组内max列
如果需要保留所有原始记录,同时新增一列显示当前组的目标列最大值,用transform更方便:
import pandas as pd target_col = "your_target_column" # 生成组ID:每4行一组 dataset["group_id"] = dataset.index // 4 # 添加组内max列 dataset[f"{target_col}_group_max"] = dataset.groupby("group_id")[target_col].transform("max") # 导出为CSV(如果不需要group_id可以去掉) dataset.to_csv("original_with_group_max.csv", index=False)
补充:原代码出错的细节
你用pd.cut(dataset.index, range(0, len(dataset), 3))时,步长3会生成0,3,6...的区间分割点,而pd.cut默认是左开右闭区间,所以索引0会被单独分到(-inf, 0]组,原本应该在一组的0-3行被拆成了两组,这就导致分组完全错误,max结果自然不对。而用dataset.index // 4是最直接的按连续行号分组的方式,完美匹配你要的0-3、4-7这类分组规则。
内容的提问来源于stack exchange,提问作者KKUser
相关产品推荐
相关产品推荐

