Как вы фильтруете строки в кадре данных на основе номеров столбцов из списка Python? - PullRequest
2 голосов
/ 01 февраля 2020

У меня есть Pandas кадр данных с двумя столбцами, x и y, которые соответствуют большому сигналу. Его размер составляет около 3 миллионов строк.

Длина волны от кадра данных

Я пытаюсь изолировать пики от сигнала. После использования scipy я получил список 1D 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 кадра данных?

1 Ответ

0 голосов
/ 02 февраля 2020

Цикл в большинстве случаев крайне неэффективен, когда дело доходит до pandas. Предполагая, что вам просто нужен отфильтрованный DataFrame, который содержит значения столбцов x и y только тогда, когда y является пиком, вы можете использовать следующий фрагмент кода:

df.iloc[peaks]

В качестве альтернативы, если вы надеетесь получить исходный DataFrame со столбцом y, сохраняющим свои пиковые значения и имеющим NaN в противном случае, тогда, пожалуйста, используйте:

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

Наконец, так как вы, похоже, заботитесь только о x значения пиков, вы можете просто переделать первый кусок следующим образом:

df.iloc[peaks].x
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...