如何使用pandas DataFrame按条件分组相似数值并合并对应字段
问题说明
- 输入为已按
Size列升序排列的Pandas DataFrame - 处理规则:将双向差值在10%范围内的
Size值归为同一组 - 输出要求:每组计算
Size列平均值,同组对应的Bell列名称做拼接合并 - 输入输出示例:

原有代码缺陷
- 遍历方式错误:
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
相关产品推荐
相关产品推荐

