使用Pandas rolling apply返回字典触发TypeError的原因咨询
报错原因及解决思路
报错根本原因
Pandas 1.5.3版本的rolling.apply()对自定义函数的返回值有强制要求:必须返回单个数值类型(整数、浮点数等),不支持返回字典、列表这类复合数据结构。
你的custom_rolling_apply函数返回的是字典,rolling.apply()在处理每个窗口的结果时,会尝试将返回值转换为实数类型存入DataFrame列,但字典无法完成这个转换,因此直接抛出TypeError: must be real number, not dict。即使你提前将目标列设为object类型也无效,因为rolling.apply()内部会先校验返回值类型,不会直接接受复合对象。
替代解决方案
如果需要同时获取窗口的求和与均值结果,推荐两种更合适的实现方式:
方式1:分开计算单个统计量
直接调用Pandas内置的滚动统计方法,简洁高效:
import pandas as pd import numpy as np df = pd.DataFrame({'A': [1, 2, 3, 4, 5]}) df['rolling_sum'] = df['A'].rolling(window=3).sum() df['rolling_mean'] = df['A'].rolling(window=3).mean()
方式2:用rolling.agg()批量计算后转字典
如果确实需要将结果存入字典列,可以先通过agg()批量计算统计量,再逐行转换为字典:
import pandas as pd import numpy as np df = pd.DataFrame({'A': [1, 2, 3, 4, 5]}) # 批量计算窗口sum和mean rolling_stats = df['A'].rolling(window=3).agg(['sum', 'mean']) # 转换为字典列 df['rolling_dict'] = rolling_stats.apply(lambda row: {'sum': row['sum'], 'mean': row['mean']}, axis=1)
内容的提问来源于stack exchange,提问作者user2165656
相关产品推荐
相关产品推荐

