Python Pandas查找大于半最大值的首尾值索引实现方法
问题场景
现有250个数据文件,每个文件包含1000个构成高斯曲线的数值,需要查找每个序列中**大于最大值一半(HotM, Half of the Maximum)**的首个值、最后一个值对应的索引。目前所有文件已加载为DataFrame列表存储。
现存问题
- 可通过
maxValues = dataframes_temp[1].max()成功获取单组数据最大值,但使用index_value_min = (dataframes_temp[1] - b[i]).apply(abs).idxmin()仅能找到最接近HotM的首个值,该值不满足「大于HotM」的要求,不符合计算目标。 - 尝试通过倒序DataFrame的方式查找最后一个符合要求的索引,代码如下:
该代码未生效,返回结果和正序查找首个接近值的结果完全一致,无法获取正确的末位索引。dataframes_temp = dataframes_list[1] dataframes_temp2 = dataframes_temp.loc[::-1] index_value_max = (dataframes_temp2[1] - b[i]).apply(abs).idxmin()
实现方法
核心逻辑不需要做差值取绝对值找最近值,直接先做布尔筛选,保留所有严格大于HotM的记录,再直接取筛选结果的首尾索引即可。
单组数据实现示例
# 提取目标序列,此处以DataFrame中索引为1的列为例 target_series = dataframes_list[1][1] # 计算当前序列的HotM hotm_value = target_series.max() / 2 # 筛选所有值严格大于HotM的记录 valid_subset = target_series[target_series > hotm_value] # 获取首个符合条件的索引 first_valid_idx = valid_subset.index[0] # 获取最后一个符合条件的索引 last_valid_idx = valid_subset.index[-1]
批量处理250个文件的实现
batch_result = [] for df in dataframes_list: # 替换为实际存储高斯数值的列索引/列名 s = df[1] # 若存在空值可先加.dropna():s = df[1].dropna() hotm = s.max() / 2 valid_indexs = s[s > hotm].index batch_result.append({ "first_idx": valid_indexs[0], "last_idx": valid_indexs[-1] })
之前倒序代码失效原因
倒序后依然使用「找与HotM差值最小的位置」逻辑,高斯曲线上最接近HotM的值本身位于上升沿靠近峰值的位置,无论正序还是倒序查找最近值,定位到的都是同一条数据的索引,自然返回结果和正序查找完全一致。
内容的提问来源于stack exchange,提问作者Jan Kodýtek
相关产品推荐
相关产品推荐

