能否让pandas rolling.apply将DataFrame传入自定义函数?
答:完全可行,但需要调整一个关键参数
当然能让你的自定义函数fn接收DataFrame子集作为输入!不过有个小细节得留意——默认情况下,pandas的rolling.apply()会把窗口内的数据以一维Series的形式传给你的函数,而非DataFrame子集。要实现你想要的效果,只需要加一个参数设置就行。
具体实现方法
你只需要在调用rolling.apply()时添加raw=False参数。当raw=False生效时,pandas会把窗口对应的行数据打包成一个小型DataFrame,直接传递给你的自定义函数fn。
给你举个可运行的示例:
import pandas as pd # 定义接收DataFrame子集的自定义函数 def fn(df_subset): # 这里可以对df_subset做任意DataFrame操作,比如计算多列的统计值组合 return df_subset['A'].mean() * df_subset['B'].median() # 创建测试用的多列DataFrame df = pd.DataFrame({ 'A': [1, 2, 3, 4, 5], 'B': [10, 20, 30, 40, 50] }) # 调用rolling.apply并设置raw=False result = df.rolling(window=2).apply(lambda x: fn(x), raw=False) print(result)
额外注意点
- 性能权衡:
raw=False的运行效率会比默认的raw=True稍低,因为需要构造和处理DataFrame对象。如果你的数据集规模极大,可能需要根据实际需求权衡是否使用该参数。 - 返回值要求:自定义函数
fn必须返回一个标量值(比如单个数字),这样rolling.apply()才能将结果组合成最终的Series/DataFrame返回。如果返回多值会直接触发报错。
内容的提问来源于stack exchange,提问作者TheRavenSpectre
相关产品推荐
相关产品推荐

