我有一个带有两列x和y的Pandas数据框,对应于一个大信号。它的大小约为300万行。

Wavelength from dataframe

我正在尝试从信号中分离出峰值。使用scipy后,我得到了与峰的索引相对应的一维Python列表。但是,它们不是信号的实际x值,而只是其相应行的索引:

from scipy.signal import find_peaks
peaks, _ = find_peaks(y, height=(None, peakline))


因此,我决定通过将其y列中的所有值都设置为NaN来过滤原始数据帧,除非它们位于峰列表中的索引上。但是,由于是3000000行,所以我反复进行此操作,这非常慢:

peak_index = 0
for data_index in list(data.index):
    if data_index != peaks[peak_index]:
        data[data_index, 1] = float('NaN')
    else:
        peak_index += 1


有谁知道一种更快的熊猫数据框过滤方法?

最佳答案

在大多数情况下,循环播放熊猫的效率极低。假设仅在x为峰值时才需要过滤的DataFrame,其中包含yy列的值,您可以使用以下代码:

df.iloc[peaks]


或者,如果您希望使用y列保留其峰值并使用NaN来检索原始DataFrame,则请使用:

df.y = df.y.where(df.y.iloc[peaks] == df.y.iloc[peaks])


最后,由于您似乎只关心峰的x值,因此可以按照以下方式重新加工第一部分:

df.iloc[peaks].x

09-11 18:17
查看更多