我有一个带有两列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,其中包含y
和y
列的值,您可以使用以下代码:
df.iloc[peaks]
或者,如果您希望使用
y
列保留其峰值并使用NaN
来检索原始DataFrame,则请使用:df.y = df.y.where(df.y.iloc[peaks] == df.y.iloc[peaks])
最后,由于您似乎只关心峰的
x
值,因此可以按照以下方式重新加工第一部分:df.iloc[peaks].x