You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

pandas rolling apply调用的自定义函数如何返回多个返回值?

问题原因

pandas 的 rolling.apply() 方法默认要求传入的自定义函数只能返回单个标量值。你返回多值元组时,pandas 无法将元组识别为可聚合的数值类型,因此抛出 No numeric types to aggregate 错误。

解决方案

以下是两种常用的兼容多返回值的实现方式:

方案1:修改自定义函数返回Series(兼容性最好)

直接将你需要返回的多个值封装为 pandas Series 对象,apply 执行时会自动将返回的 Series 展开为 DataFrame 的多列:

import pandas as pd

def max_dd(ser):
    # 保留你原有计算 i、j、dd 的逻辑
    # compute i,j,dd
    return pd.Series([i, j, dd], index=['date1', 'date2', 'dd'])

# 调用时直接接收返回的多列DataFrame
res_df = df.rolling(window).apply(max_dd, raw=False)
# 按需提取对应列
date1, date2, dd = res_df['date1'], res_df['date2'], res_df['dd']

注意要指定 raw=False(该参数默认值就是False,低版本pandas需手动指定),保证函数接收的输入是Series类型,返回的Series才能被正确识别。

方案2:使用result_type参数自动展开(适合不想修改原函数的场景)

如果你不想改动原有的max_dd函数,可在调用时通过result_type='expand'参数让pandas自动把返回的元组/列表展开为多列,该参数在pandas 1.1.0及以上版本支持:

# 原函数无需修改
def max_dd(ser):
    # compute i,j,dd
    return i,j,dd

# 调用时指定result_type参数
res_df = df.rolling(window).apply(max_dd, raw=False, result_type='expand')
res_df.columns = ['date1', 'date2', 'dd']
date1, date2, dd = res_df['date1'], res_df['date2'], res_df['dd']

内容的提问来源于stack exchange,提问作者Ivan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 22:57:01