如何在Pandas中为各列应用不同窗口长度的移动平均?
给DataFrame每列应用不同窗口长度的移动平均
刚好碰到过一模一样的需求!Pandas本身没有直接的内置函数能一次性给每列指定不同的移动窗口长度,但我们有两种简洁高效的方法来实现,完全不需要繁琐的手动循环:
方法1:用pd.concat + 生成器表达式(最直观)
这种方法思路很直接:把每一列和对应的窗口长度配对,分别计算移动平均,最后再拼回一个DataFrame。代码示例如下:
import pandas as pd import numpy as np # 先构造测试数据 df = pd.DataFrame(np.random.randn(10, 3), columns=['Col1', 'Col2', 'Col3']) windows = [1, 3, 5] # 对应Col1窗口1,Col2窗口3,Col3窗口5 # 核心代码 result_df = pd.concat( [df[col].rolling(window=win).mean() for col, win in zip(df.columns, windows)], axis=1 )
这个方法的好处是可读性极强,每一步都清晰,而且rolling是Pandas的向量化操作,效率比纯Python循环高很多。
方法2:用apply配合列索引映射
如果你更倾向于用apply的写法,也可以通过列名获取对应的窗口长度,把参数动态传入:
result_df = df.apply( lambda col: col.rolling(window=windows[df.columns.get_loc(col.name)]).mean(), axis=0 )
这里的关键是df.columns.get_loc(col.name)拿到当前列在DataFrame中的索引,再从windows向量里取出对应的窗口值。
补充说明
两种方法本质上都是调用Pandas的rolling向量化方法,性能差异可以忽略。如果你的DataFrame非常大,这两种方法都比手动遍历每列再赋值要高效得多。
内容的提问来源于stack exchange,提问作者Michael
相关产品推荐
相关产品推荐

