在DataFrame列中对数组进行矢量化功能吗?

时间:2019-05-15 17:38:51

标签: python arrays pandas dataframe apply

我想对Dataframe列中的每个元素(该列的每个元素都是一个数组)使用一个函数(scipy.signal.savgol_filter)。尽管循环似乎有点不必要,但是我无法将头放在矢量化解决方案周围。

我尝试了显而易见的.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 :(得分:0)

问题在于,当您尝试将其视为多维数组时,元素的形状不相同。

如果只想将该功能应用于每一行,则需要显式选择列:

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

但是,这实际上不是向量化的解决方案。

编辑:

值得补充的是,在numpy问题跟踪器上有关于此错误消息的歧义的讨论。

请参见herehere

相关问题