python - 如何根据 Python 列表中的列号过滤数据框中的行?

标签 python arrays pandas dataframe machine-learning

我有一个 Pandas 数据框,有两列 x 和 y,对应于一个大信号。其大小约为 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

有谁知道过滤 Pandas 数据帧的更快方法是什么?

最佳答案

对于 pandas 来说,大多数情况下循环效率极低。假设您只需要仅当 y 为峰值时包含 xy 列值的过滤 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/

相关文章:

javascript - 在javascript 2d矩阵中查找连接的组件

java - 如何为字符串数组获取 10 个随机字符串?

Python:根据DataFrame中的列名创建新行

python - 在python中将列表打印为不带括号或逗号的字符串

python - 如何使用 Pandas 计算另一列中每个值在一列中的出现次数?

python - Python 中嵌套列表的算术运算

regex - 在Matlab中以最通用的方式从char数组中提取数值数组

python - 在python中获取函数名称作为字符串

Python/Pandas - 当只有一个值需要计算时,有没有一种方法可以使mean()返回NaN?

pandas - 减去两个数据帧