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

查找多个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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 11:27:22