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

如何使用pandas DataFrame按条件分组相似数值并合并对应字段

问题说明
  • 输入为已按Size列升序排列的Pandas DataFrame
  • 处理规则:将双向差值在10%范围内的Size值归为同一组
  • 输出要求:每组计算Size列平均值,同组对应的Bell列名称做拼接合并
  • 输入输出示例:
    DataFrame输入输出效果示例
原有代码缺陷
  • 遍历方式错误:range()无法直接接收DataFrame对象作为入参,不能直接用于遍历DataFrame行
  • 判断逻辑冗余:双层循环内的10%差值判定条件重复编写两次,且使用位运算符&时未给独立条件加括号,会因运算符优先级触发逻辑错误
  • 核心流程缺失:未实现分组标记、分组聚合的关键逻辑,无法输出目标结果
实现方案

由于输入DataFrame已经按Size升序排列,无需使用时间复杂度为O(n²)的双层嵌套循环,单次线性遍历即可完成分组标记,再通过pandas内置的groupby聚合即可得到结果,代码如下:

import pandas as pd

def full_data_compare(self, df_full = pd.DataFrame()):
    # 空表直接返回空结果
    if df_full.empty:
        return pd.DataFrame(columns=['Size', 'Bell'])
    
    df = df_full.reset_index(drop=True).copy()
    # 初始化分组参数
    group_tags = [0]
    current_group_id = 0
    base_size = df.loc[0, 'Size']

    # 单次遍历完成分组标记
    for idx in range(1, len(df)):
        curr_size = df.loc[idx, 'Size']
        # 升序场景下只需判断当前值是否不超过组基准值的110%即可,下限天然满足
        if curr_size <= base_size * 1.1:
            group_tags.append(current_group_id)
        else:
            # 超出阈值新建分组,更新基准值
            current_group_id += 1
            base_size = curr_size
            group_tags.append(current_group_id)
    
    df['group_tag'] = group_tags

    # 分组聚合
    result = df.groupby('group_tag', as_index=False).agg(
        Size=('Size', 'mean'),  # 组内Size取平均值
        Bell=('Bell', lambda x: ','.join(x.astype(str)))  # Bell列用逗号拼接,可按需更换分隔符
    ).drop(columns='group_tag')

    return result

补充说明

  • 若10%差值的判定基准需要改为组内动态平均值而非组首值,只需在遍历过程中实时更新当前组的Size平均值作为判定基准即可,整体逻辑无需大改
  • Bell列的拼接分隔符可根据业务需求替换,比如修改为;、/等,只需调整join方法的入参
  • 该实现时间复杂度为O(n),数据量较大时运行效率远高于双层嵌套循环

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 16:09:21