我有一个 Pandas 数据框,有两列 x 和 y,对应于一个大信号。其大小约为 300 万行。
我正在尝试将峰值与信号隔离。使用 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
有谁知道过滤 Pandas 数据帧的更快方法是什么?
最佳答案
对于 pandas 来说,大多数情况下循环效率极低。假设您只需要仅当 y
为峰值时包含 x
和 y
列值的过滤 DataFrame,您可以使用以下片段代码:
df.iloc[peaks]
或者,如果您希望检索原始 DataFrame,其中 y
列保留其峰值并具有 NaN
,否则请使用:
df.y = df.y.where(df.y.iloc[peaks] == df.y.iloc[peaks])
最后,由于您似乎只关心峰值的 x
值,因此您可以按以下方式重新设计第一部分:
df.iloc[peaks].x
关于python - 如何根据 Python 列表中的列号过滤数据框中的行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60012951/