Функция векторизации массивов в столбце DataFrame? - PullRequest
0 голосов
/ 15 мая 2019

Я хочу использовать функцию (scipy.signal.savgol_filter) для каждого элемента в столбце Dataframe (каждый элемент столбца является массивом). Хотя цикл кажется немного ненужным, я не могу обернуть голову вокруг векторизованного решения.

Я попробовал очевидный метод .apply, а также просто использовал функцию для столбца. Оба показывают ошибку типа «установка элемента массива с помощью последовательности».

Пример кода со списками вместо массивов (но с одинаковыми результатами):

import pandas as pd
from scipy import signal 
df = pd.DataFrame(data={'A': [[1,3,9], [7,2,3], [3,2,6,3], [2,3,4]]})
df['smooth'] = df.apply(signal.savgol_filter, args=(3, 0))

Соответственно:

df['smooth'] = signal.savgol_filter(df['A'], 3, 0)

Или:

df['smooth'] = signal.savgol_filter(df['A'].values, 3, 0)

Ни одна из этих работ, я думаю, потому что весь столбец передан функции. Есть ли способ использовать функцию на всех элементах (= массивах) в столбце одновременно или мне нужно циклически проходить по каждой строке?

1 Ответ

0 голосов
/ 15 мая 2019

Проблема в том, что ваши элементы не имеют одинаковую форму при попытке рассматривать его как многомерный массив.

Если вы просто хотите применить эту функцию к каждой строке, вам нужно явно выбрать столбец:

df['smooth'] = df['A'].apply(signal.savgol_filter, args=(3, 0))

Однако это не векторизованное решение.

Изменить:

Стоит добавить, что на трекере проблем numpy обсуждается двусмысленность этого сообщения об ошибке.

См. здесь и здесь

...