查找多个DataFrame中10%误差内的元素并计算均值(兼容不同尺寸)
多DataFrame 10%误差匹配泛化实现方案
原有代码存在的问题
- 硬编码双对象比对逻辑,无法支持≥2个任意数量输入的处理场景
- 前置等长校验逻辑直接拦截了尺寸不一致的DataFrame输入,没有兼容处理方案
- 双层循环没有做匹配分组标记,无法实现跨多源的同组数值聚合求均值
尺寸不一致场景处理规则
- 取消前置长度校验,所有输入对象的数值统一进入匹配候选池,不会因为不同对象的DataFrame行数不同中断流程
- 仅在多个来源的数值落在±10%误差区间时才做聚合,单个来源独有的、无其他匹配项的数值直接保留原始值,不会丢弃
- 匹配完成后统一输出结构化结果,不需要对齐不同输入的DataFrame索引
可直接复用的实现代码
import pandas as pd def add_well_peak(self, *others): # 收集所有输入对象的有效数据,存入统一候选集 all_records = [] # 先加载当前对象自身的数据 for row_idx in range(len(self.Bell)): all_records.append({ "size": int(self.Bell.iloc[row_idx]["Size"]), "bell_value": self.Bell.iloc[row_idx]["Bell"] }) # 遍历所有传入的其他对象,加载数据,不受长度限制 for other_obj in others: for row_idx in range(len(other_obj.Bell)): all_records.append({ "size": int(other_obj.Bell.iloc[row_idx]["Size"]), "bell_value": other_obj.Bell.iloc[row_idx]["Bell"] }) # 无有效数据直接返回空结果 if not all_records: return pd.DataFrame(columns=["matched_size", "matched_bell_value", "match_count"]) # 按Size值排序,为滑动窗口分组做准备 total_df = pd.DataFrame(all_records).sort_values("size").reset_index(drop=True) # 按±10%误差阈值做滑动分组 groups = [] current_group_indexes = [0] current_base_size = total_df.iloc[0]["size"] for i in range(1, len(total_df)): current_size = total_df.iloc[i]["size"] # 因已升序排列,当前值必然大于等于基准值,仅需判断上限即可 if current_size <= current_base_size * 1.1: current_group_indexes.append(i) else: groups.append(current_group_indexes) current_group_indexes = [i] current_base_size = current_size # 追加最后一个分组 groups.append(current_group_indexes) # 分组聚合:同组求平均,单值直接保留 result_list = [] for group_idx in groups: group_data = total_df.iloc[group_idx] result_list.append({ "matched_size": group_data["size"].mean(), "matched_bell_value": group_data["bell_value"].mean(), "match_count": len(group_data) # 值为1时代表无匹配项,为原始保留值 }) return pd.DataFrame(result_list)
逻辑说明
- 方法入参用
*others接收任意数量的输入对象,调用时直接传入所有需要比对的对象即可,比如self.add_well_peak(other1, other2, other3) - 输出结果的
match_count字段可以直接区分聚合结果和原始保留值:字段值为1就是无匹配的原始值,大于1就是多个匹配值求平均的结果 - 当前分组逻辑以组内最小Size为基准做10%误差判断,适配信号峰、色谱峰匹配的通用场景;如果需要严格保证组内任意两值偏差不超过10%,只需要调整分组阶段的阈值判断逻辑即可。
提示:如果你的DataFrame中
Size/Bell列的列名和示例不一致,直接替换代码中对应的列名字符串即可。
内容的提问来源于stack exchange,提问作者BlockH
相关产品推荐
相关产品推荐

