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
相关产品推荐
相关产品推荐

