非整数索引的pandas Series中如何查找符合阈值的峰值及对应原索引
问题原因
scipy的find_peaks接口返回的是输入序列的整数位置下标,和你传入的pandas Series的自定义索引无关,你得到的array([ 1, 16], dtype=int64)是峰值在计数Series里的顺序位置,不是原索引值。
调整方案
你只需要把返回的位置下标映射到原计数Series的index上即可,优化后代码如下:
import pandas as pd from scipy.signal import find_peaks import matplotlib.pyplot as plt thresh = 100 # 预先保存计数结果,避免重复执行value_counts count_series = out.value_counts(sort=False) # 获取峰值的顺序位置 peak_pos, _ = find_peaks(count_series, height=thresh) # 映射得到原索引的峰值位置 peak_original_idx = count_series.index[peak_pos] # 获取对应峰值 peak_values = count_series.iloc[peak_pos] # 绘图逻辑 plt.plot(peak_original_idx, peak_values, 'r.') count_series.plot.bar() plt.show() # 输出预期结果 print(peak_original_idx.tolist()) print(peak_values.tolist())
运行后输出结果为:
[1.0, 8.5] [279, 139]
补充说明
你之前的绘图代码已经用到了原索引映射的逻辑,只是最后直接打印了find_peaks返回的位置下标,才会得到不符合预期的整数结果。
内容的提问来源于stack exchange,提问作者Hossam Rdowan
相关产品推荐
相关产品推荐

