首页 > 解决方案 > Savgol 过滤数据框列

问题描述

我正在尝试应用 SciPy 的 savgol 过滤器来平滑我的数据。通过分别选择每一列、定义一个新的 y 值并绘制它,我已经成功地应用了过滤器。但是,我想以更有效的方式在数据帧中应用该函数。

y0 = alldata_raw.iloc[:,0]
w0 = savgol_filter(y0, 41, 1)

我的第一个想法是创建一个空数组,编写一个 for 循环将函数应用于每一列,将其附加到数组中,最后连接数组。但是我收到一个错误'TypeError:无法连接类型为“”的对象;只有 pd.Series、pd.DataFrame 和 pd.Panel(已弃用)obj 有效'

smoothed_array = []
for key,values in alldata_raw.iteritems():
    y = savgol_filter(values, 41, 1)
    smoothed_array.append(y)

alldata_smoothed = pd.concat(smoothed_array, axis=1)

相反,我尝试使用 pd.apply() 函数,但是我遇到了问题。我有一条错误消息:“TypeError:预期 x 和 y 的长度相同”

alldata_smoothed = alldata_raw.apply(savgol_filter(alldata_raw, 41, 1), axis=1)
print(alldata_smoothed)

我对 python 很陌生,所以任何关于如何使每种方法工作的建议以及哪种方法更可取将不胜感激!

标签: pythonpandasscipy

解决方案


为了使用过滤器,首先创建一个带有单个参数的函数 - 列数据。然后您可以将其应用于数据框列,如下所示:

from scipy.signal import savgol_filter
def my_filter(x):
    return savgol_filter(x, 41, 1)
alldata_smoothed = alldata_raw.apply(my_filter)

你也可以使用一个lambda函数:

alldata_smoothed = alldata_raw.apply(lambda x: savgol_filter(x,41,1))

axis=1inapply指定将函数应用于数据框行。您需要的是默认选项axis=0,这意味着将其应用于列。

这很笼统,但文档告诉savgol_filter我它也接受一个axis论点。因此,在这种特定情况下,您可以一次将过滤器应用于整个数据帧。这可能会更高效,但我还没有检查 =)。

alldata_smoothed = pd.DataFrame(savgol_filter(alldata_raw, 41, 1, axis=0),
                                columns=alldata_raw.columns,
                                index=alldata_raw.index)

推荐阅读