Python 查找数组中高于指定阈值的最大值及其对应索引的方法
修复方案
问题根源
你的推测完全正确,错误有两点:
pandas.Series.idxmax()不需要传入最大值参数,它会自动返回调用序列的最大值对应的行索引- 原代码直接对完整的强度列调用
idxmax(),没有应用eV < xMax的过滤条件,返回的是全列最大值的索引,不是过滤后子集的最大值索引
修正后代码
import pandas as pd import numpy as np # 读取数据部分保持不变 df = pd.read_csv("你的文件路径") column_names = ['a','b',...] # 替换为你的实际强度列名 xMax = 1.9 def find_filtered_max_info(x_col, intensity_col, wav_col, ev_col, x_threshold): # 生成过滤掩码 mask = x_col < x_threshold # 过滤后的强度序列,保留原始DataFrame的行索引 filtered_int = intensity_col[mask] # 处理空过滤结果的异常情况 if filtered_int.empty: return None, None, None, None max_int = filtered_int.max() # 直接取过滤后序列的最大值索引,对应原始df的行索引 max_idx = filtered_int.idxmax() max_wav = wav_col.iloc[max_idx] max_ev = ev_col.iloc[max_idx] return max_int, max_idx, max_wav, max_ev # 循环处理每一列强度数据 for col in column_names: max_int_val, max_wav_index, max_wav_val, max_eV_val = find_filtered_max_info( df['eV'], df[col], df['Wavelength'], df['eV'], xMax ) # 这里可以添加打印或者存储结果的逻辑,比如: if max_int_val is not None: print(f"列{col}的结果:强度={max_int_val}, 波长={max_wav_val}, eV={max_eV_val}") else: print(f"列{col}在eV<{xMax}范围内无有效数据")
逻辑说明
- 核心是通过布尔掩码
mask = df['eV'] < xMax过滤数据时,保留原始DataFrame的行索引,过滤后的序列调用idxmax()返回的索引可以直接对应到原始数据的波长、eV列 - 增加了空结果判断,避免过滤后无数据时抛出异常
内容的提问来源于stack exchange,提问作者Bbb
相关产品推荐
相关产品推荐

