Pandas expanding/rolling窗口apply操作触发float转换TypeError原因求解
报错原因
- pandas提供的
rolling()/expanding()窗口的apply方法,要求传入的自定义函数必须返回单个标量值(比如数值、字符串等),每个窗口的计算结果会以标量形式填充到结果序列的对应位置。 - 你示例中使用的
lambda x: x,输入参数x是当前窗口对应的一维numpy数组,直接返回x属于返回数组对象,pandas无法将数组转换为预期的单个float类型值,因此触发类型报错,该报错和原始数据列的dtype没有关联,rolling窗口触发报错的原因和expanding完全一致。
验证方法
你可以修改自定义函数让它返回标量,即可正常运行,示例如下:
# 计算每个expanding窗口的最大值 df.a.expanding(2).apply(lambda x: x.max()) # 输出 0 NaN 1 20.0 2 200.0 3 200.0 Name: a, dtype: float64
特殊场景处理
如果你确实需要保留每个窗口的完整数组内容,可以将返回值封装为单个元组/列表对象,避免触发标量转换校验:
res = df.a.expanding(2).apply(lambda x: (x,)) print(res.iloc[1]) # 输出 (array([ 1., 20.]),)
内容的提问来源于stack exchange,提问作者Mittenchops
相关产品推荐
相关产品推荐

