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

Pandas调用rolling滚动窗口apply方法时丢失列名的原因与解决咨询

现象成因

核心原因是Pandas的rolling.apply()方法默认按列处理数据,每次给自定义函数传入的是当前窗口的一维Series对象,而非子DataFrame,所以你在函数内部打印的时候,自然不会显示原DataFrame的列名,只会输出索引和对应数值。
如果调用时还设置了raw=True参数,传入函数的甚至会是无索引无列名的numpy数组,连行索引信息都会丢失。

解决方案

方案1:函数内部将传入的Series转为DataFrame(推荐,改动最小)

如果你确认处理的是单列DataFrame,直接在函数内部把传入的Series转为带指定列名的DataFrame即可,调用时记得加raw=False确保传入的是带索引的Series:

def max_dd(window_series):
    # 转为带Close列名的DataFrame
    df = window_series.to_frame(name="Close")
    print(df)
    # 后续你的最大回撤计算逻辑写在这里
    return None

# 调用时指定raw=False,传入Series而非numpy数组
df.rolling(45).apply(max_dd, raw=False)

方案2:手动遍历滚动窗口(支持多列场景,灵活度最高)

如果需要处理多列、或者需要完整的子DataFrame结构,可以手动遍历窗口索引切片原DataFrame,完全规避滚动apply的限制:

window_size = 45
# 存储结果的列表,按需使用
res_list = []
for i in range(window_size, len(df) + 1):
    # 切片得到的是完整的子DataFrame,保留原列名和索引
    window_df = df.iloc[i-window_size:i, :]
    res = max_dd(window_df)
    res_list.append(res)

内容的提问来源于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:39:02